
売上テーブルにID、日付、A店舗売上額、B店舗売上額、・・・を入れています。このデータから月初から当日までの累計と前年同月同日対比を表示させたいのですが、どうすればいいでしょう?その日だけではなく、昨日、一昨日・・・のデータも表示させたいのですが。今まではEXELでやっていたのですが、月が変わるたびに、シートを増やし、一昨年のシートからデータを取るという作業があるのと、別のEXELのファイルに簡単な損益計算書を作っているのですが、そのデータをコピーする手間を省きたいと考えてます。またこの損益計算書も同じアクセスのファイル(データベース)で作りたいと考えています。
No.3ベストアンサー
- 回答日時:
長い回答になり申し訳ありません。
前提として、今年と昨年のデータが構造が同じテーブルに入力されているとします。peace510さんはクエリ、レポートは使えるが、フォームやモジュールは使えないと思って書いています。
[]で括られているものはテーブル名など総称を意味します。
まず、今年の売上をクエリで日付の抽出をします。抽出条件は Between DateSerial(Year(Now()),Month(Now()),1) And Now() ←今月の初日から今日までという意味です。
抽出条件を入力したらSQLビュー(表示→SQLビュー)にしてFROMの前でSERECT行の最後に「, format([テーブル名].[日付フィールド名],"mmdd") as [新しいフィールド名]」と入力します。←日付データを月日だけにして新しいフィールドを作ります。
そのクエリの名前を「Q_今年売上」とするとQ_今年売上を基にクエリを作ります。
名前を「Q_今年売上合計」とするとQ_今年売上のIDと日付を除いた、売上データのみをフィールドに選択して、Σ(集計)ボタンを押し、集計の欄を「合計」にします。
フィールド名が「~の合計」となるので気になるようならばSQLビュー(表示→SQLビュー)にして、「Sum(Q_今年売上.[フィールド名]) AS フィールド名の合計」などの「AS」の後ろを変更します。
これで、Q_今年売上が期間抽出されたデータ、Q_今年売上合計が期間抽出されたデータの合計(当日までの累計)になります。
次に、昨年の売上をクエリで日付の抽出をします。抽出条件は Between DateSerial(Year(Now())-1,Month(Now()),1) And DateSerial(Year(Now())-1,Month(Now()),Day(Now())) ←今年-1の同月初日から同月同日まで
抽出条件を入力したらSQLビュー(表示→SQLビュー)にしてFROMの前でSERECT行の最後に「, format([テーブル名].[日付フィールド名],"mmdd") as [新しいフィールド名]」と入力します。←新しいフィールドを作ります。
そのクエリの名前を「Q_昨年売上」とでもしておきます。
次にQ_今年売上とQ_昨年売上を基にクエリを作ります。さきほど作った新しいフィールド(月日だけを抽出したもの)を結合させて、結合プロパティを「Q_今年売上の全レコードとQ_昨年売上の同じ結合フィールドのレコードだけを含める」にします。
フィールドに入れる値を選択しますが、日付はQ_今年売上の日付を入れると良いでしょう。フィールド名の変更は合計を出したところで説明しています。
このクエリの名前を「Q_売上比較」とでもします。
Q_売上比較と、Q_今年売上合計を基にレポートを作ります。このクエリには月毎のすべての売上が含まれますので、あとは加工次第ですね。抽出の範囲を変更したいときは、ヘルプを見ながら勉強してください。
あとの演算はがんばってください。
クエリだけに頼らずに、モジュールも使うと楽にいろんなことができますよ。
この回答への補足
ありがとうございます。読んだだけではよくわからないので、一度試してみます。フォームも同じ要領でいいんですね。モジュールは基本的にほとんどイベント型のサブプロシージャのみを作っています。DAOからADOに変わって、他データベースに接続したりするのが、こんがらがってます。Functionプロシージャ-は
Function topday() As Date '現在の月の月初(1日)を計算します。
Dim firstdate As Date ' 変数を宣言します。
Dim intervaltype As String
Dim number As Integer
intervaltype = "d" ' "d" によって追加する時間間隔として、日を指定します。
firstdate = Date - Day(Date)
number = 1
topday = DateAdd(intervaltype, number, firstdate)
End Function
ぐらいでしょうか?もしよろしければ、モジュールでの作り方も教えていただければ、うれしいです。SQLはちょっと苦手です。ありがとうございました。
ありがとうございます。このページ初めて使ったので、補足にも同じ内容を入れてしまいました。読んだだけではよくわからないので、一度試してみます。フォームも同じ要領でいいんですね。モジュールは基本的にほとんどイベント型のサブプロシージャのみを作っています。DAOからADOに変わって、他データベースに接続したりするのが、こんがらがってます。Functionプロシージャ-は
Function topday() As Date '現在の月の月初(1日)を計算します。
Dim firstdate As Date ' 変数を宣言します。
Dim intervaltype As String
Dim number As Integer
intervaltype = "d" ' "d" によって追加する時間間隔として、日を指定します。
firstdate = Date - Day(Date)
number = 1
topday = DateAdd(intervaltype, number, firstdate)
End Function
ぐらいでしょうか?もしよろしければ、モジュールでの作り方も教えていただければ、うれしいです。SQLはちょっと苦手です。ありがとうございました。
No.2
- 回答日時:
前年対比の場合は、状況によって異なります。
(1)対象範囲の本年のデータを基準にしてしまっていいのなら簡単です。
(2)しかし、前年のデータが存在して、本年のデータがない場合を表示させたい
などの条件が入る場合は、コーディングで配列などにデータを落としたり、
ワークテーブルなどに一時保存して 出力の度データを作成してやる必要があります。
(1)対象範囲の本年のデータを基準にしてしまっていい場合は
クエリをいくつか作ってやり(本年、昨年、一昨年など)
それらをクエリで再度結合してやればできます。
(2)の場合は、まず本年のデータを作成、次に昨年のデータを同店舗同月同日のデータがあれば、昨年の格納場所に保存、なければ、データを追加という風にやって生きます。
なんにしろ、アクセスなら、プログラムを組めば体外のことはできます。
ありがとうございます。参考にさせて頂きます。アクセスは奥が深いので、大好きです。ただ、没頭しないと出来ないので、なかなか作ることが少なく、後で自分の作ったデータベース、特にVBAは自分でもわからず、なかなか進歩しない毎日です。集計や分析はEXELが得意かと思いその必要のあるものは、ほとんどEXELでやってしまいます。今回は入力は私がしていないので、月ごとにシートを増やすのが手間なので、新しくチャレンジしようと思いました。参考本の在庫データベースでも、過去の残高(昨日の残高、一昨日の残高など)は表示せず、今日現在(最終レコード)の残高を表示させるようにしているので、アクセスではこういううのは難しいと思ってました。早速試してみます。ありがとうございました。
No.1
- 回答日時:
i-haradaです。
邪道?なのかもしれませんが、我流の方法として「今年テーブル」の日付をクエリーで分解しくっ付けて「月/日」を作ります。前年テーブルも同じようにクエリー上で「月/日」を作り同じクエリー上でリレーションで繋ぎ対比させたいフィールドを表示させて、%をだす。抽出は基の日付でbetweenでどうでしょうか?
それを元にレポートを作ればOK?
試してないので他に手段がなければやって見て下さい。
やっぱ邪道だな!\(_ _)
ありがとうございます。他の人の回答を見せていただくと、邪道ではないのではないでしょうか?だけど僕も我流でアクセスはやってるので、結構邪道っぽいのも好きです。間違ってるかもしれませんが、アクセスは自分の求めている便利さを追求できれば、その作る過程が楽しいので、少しぐらい邪道でもよしと思っています。これが、お金をもらってつくるのなら、そういう訳には行かないでしょうけれど、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
アクセスで#エラーを表示させない方法は?
Access(アクセス)
-
accessの日付フィールドから前年度だけを取り出したい
Access(アクセス)
-
アクセスで追加した項目に全て同じ値を一発で入れたい
Access(アクセス)
-
-
4
アクセスで月単位の抽出
Access(アクセス)
-
5
テキストボックスにクエリ結果を表示させたい
その他(データベース)
-
6
accessで複数年度のデータを蓄積する方法
その他(データベース)
-
7
Accessのマクロでモジュールを実行させたい。
Access(アクセス)
-
8
Access クエリで、レコードの無い日付も出力したい
Access(アクセス)
-
9
アクセスで『0の値以外』を表示する方法
Access(アクセス)
-
10
クエリで割り算する方法を教えてください
Access(アクセス)
-
11
Access2003 クエリで、空の列は作れますか?
Access(アクセス)
-
12
アクセスのクエリについて(前当期比較させたい)
その他(データベース)
-
13
accessでクエリをExcelにエクスポートする時にファイル名に日付を追加したい
Access(アクセス)
-
14
前のレコードの値を自動で入れたい
PowerPoint(パワーポイント)
-
15
Access 同じデータをたくさんのレコード(同一列)に一度に入力するには
Access(アクセス)
-
16
ACCESSで1月1日~12月31日までの日付を入れる方法
その他(データベース)
-
17
accessで数値の表示桁数を指定する方法
Excel(エクセル)
-
18
「年」と「月」だけの日付の表示方法
Excel(エクセル)
-
19
Access 別フォームへの再クエリ(更新)がしたい。
その他(データベース)
-
20
Access2010 「演算子がありません」エラー
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アクセスクエリで以前あった演...
-
別のテーブルのフィールドを抽...
-
Accessのクエリで、Left関数を...
-
宛名作成(Word)の郵便番号が...
-
テーブルに主キーを作らないデ...
-
ACCESS クエリで重複データを最...
-
アクセスにエクセルのデータを...
-
アクセスのフォームのビューが...
-
選択したチェックボックスのみ...
-
Accessのフォーム上にレコード...
-
ACCESSでクエリを作成したら「...
-
ACCESSで入力フォームをHTMLフ...
-
Accessのフォームで作業領域を...
-
Access あるクエリを利用して...
-
Access 別フォームへの再クエ...
-
accessのレポートであとから他...
-
Accessフォームでデータ入力で...
-
access SQLの抽出結果をFilter...
-
アクセス・フォームのレコード...
-
アクセスでテーブルの変更内容...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessのクエリで、Left関数を...
-
アクセスで前年対比を出す方法...
-
Access2000 2番目に大きい数値...
-
別のテーブルのフィールドを抽...
-
access で「指定したフィール...
-
【至急】Mp3tagで歌手情報を追...
-
Accessでフォームへのフィール...
-
アクセスのフィールドデータを...
-
宛名作成(Word)の郵便番号が...
-
式の意味を教えてください
-
Microsoft Accessでのレコード...
-
アクセス クエリについて2点お...
-
Accessのクエリ
-
Accessでグループ化した結果フ...
-
アクセス2010でフィールドから...
-
ACCESSの関数について
-
ファイルメーカー5.5から4...
-
【access】テキストから日付へ...
-
ACCESS2000について
-
ファイルメーカーで名前のよみ...
おすすめ情報