前提
Microsoft Accessを使ってレポート作成をしています。
クロス集計した結果をレポートに反映させたいのですが、
列の数が動的に変化するため、改ページして2枚目以降のレポート作成をどのようにすればいいのか試行錯誤しています。
クロス集計で表示したい内容を出すところまではできましたが、
レポートの表示列が固定(?)なため、何列ごとに改ページするというような内容をVBでコードを書いていくしかないと思いますが、何列目が終わったら改ページして再度同様の内容で続きの集計結果を描写するという方法が思いつきません。
お知恵をお貸しいただけますと幸いです。
実現したいこと
- 指定した年月の範囲を抽出条件としてクロス集計する
- 一番左の列(日)は固定で、1日~31日を表示
- 次の列から指定した年月日の範囲を表示
<例> 2017年05月~2019年03月を抽出条件として指定して、その範囲の検索結果を表示
- 指定した年月の範囲はクエリの列固定とする
- 1枚の列表示は「日」の項目を合わせて5列表示とする
クロス集計結果
日 | 2021-01 | 2022-02 | 2022-03 | 2022-04 | 2022-05 | 2022-06 | --- | |
---|---|---|---|---|---|---|---|---|
金額 | 金額 | 金額 | 金額 | 金額 | 金額 | |||
1日 | 70000 | 1000000 | ||||||
2日 | 30000 | 60000 | 100000 | |||||
3日 | 50000 | 100000 | ||||||
4日 | 10000 | 80000 | ||||||
5日 | 20000 | |||||||
6日 | 40000 | |||||||
7日 | 200000 | |||||||
8日 |
上記内容を下記のような形にレポート作成することは可能でしょうか?
- 1枚目
日 | 2021-01 | 2022-02 | 2022-03 | 2022-04 |
---|---|---|---|---|
金額 | 金額 | 金額 | 金額 | |
1日 | 70000 | |||
2日 | 30000 | 60000 | ||
3日 | 50000 | |||
4日 | 10000 | 80000 | ||
5日 | 20000 | |||
6日 | 40000 | |||
7日 | 200000 | |||
8日 |
- 2枚目
日 | 2021-05 | 2022-06 |
---|---|---|
金額 | 金額 | |
1日 | 1000000 | |
2日 | 100000 | 30000 |
3日 | 100000 | |
4日 | ||
5日 | 20000 | |
6日 | ||
7日 | ||
8日 |
該当のソースコード
- 日付テーブル(内容は1-31)
- 販売テーブル
ID | 取引先コード | 取引先名 | 商品コード | 商品名 | 単価 | 数量 | 日付 |
---|---|---|---|---|---|---|---|
1 | 1 | A商店 | 11111 | 商品A | 100 | 10 | 2022/7/1 |
2 | 1 | A商店 | 11111 | 商品A | 100 | 5 | 2022/7/14 |
3 | 1 | A商店 | 11111 | 商品A | 100 | 6 | 2022/7/21 |
4 | 1 | A商店 | 11111 | 商品A | 100 | 1 | 2022/6/16 |
5 | 1 | A商店 | 11111 | 商品A | 100 | 22 | 2022/6/10 |
6 | 1 | A商店 | 11111 | 商品A | 100 | 3 | 2022/6/14 |
7 | 1 | A商店 | 11111 | 商品A | 100 | 7 | 2022/5/18 |
8 | 1 | A商店 | 11111 | 商品A | 100 | 8 | 2022/5/27 |
9 | 1 | A商店 | 11111 | 商品A | 100 | 9 | 2022/8/5 |
10 | 1 | A商店 | 11111 | 商品A | 100 | 16 | 2022/8/9 |
11 | 1 | A商店 | 11111 | 商品A | 100 | 5 | 2022/8/7 |
- 集計クエリ
SELECT Format$(販売クエリ.日付, "yyyy-mm-01") AS [month], Day(販売クエリ.日付) AS 日, 販売クエリ.日付, 販売クエリ.取引先コード, 販売クエリ.取引先名, 販売クエリ.商品コード, 販売クエリ.商品名, [数量]*[単価] AS 値 FROM 販売クエリ;
- クロス集計
TRANSFORMMin(Q_1.値) AS 値の最小 SELECT F_日付.日付 FROM F_日付 LEFT JOIN Q_1 ON F_日付.日付 = Q_1.日 GROUP BY F_日付.日付, Q_1.日付 PIVOT Q_1.Month IN ("2022-01-01","2022-02-01","2022-03-01","2022-04-01","2022-05-01","2022-06-01")
1ページは4か月分(4列)の表示ですが、列数は最大何列までですか。
また、行数は最小は何行、最大は何行でしょう。最大の場合は、1ページに収まりますか。
列数はユーザーが指定する年月の範囲なので1つ以上~で最大何列になるかは不明です。
また、行数は1日~31日の31行で固定です。
1ページに31行と4か月分毎に表示したいと考えております。
日付テーブル(内容は1-31)
とのことですので、行は31行固定ということですね。
この31行は1ページに収まりますか。
あっ、かぶりました。
状況は把握できました。
最初は、1日~31日の行を列にして(31行と固定なため)、何か月分のデータを行にして・・と考えていましたが、
1日~31日を縦表示にしたいためぐるぐる悩み中です。。。
hatena19様
もし可能であれば、追加で質問させていただきたいのですが、
Accessのクエリは、100個UNION ALLするのと、数千回ループして一時テーブルにインサートするのはどちらが好ましいかご存じでしょうか?UNION ALLは重い処理で有名なのであまりするべきではないと思うのですが、かといってループを何千回するのもどうかと思いお尋ねしました。(年月と日の組み合わせを作成するときにふと思いました)
