Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : Access 2010)
グラフの凡例並び替え
投稿日時: 18/11/01 18:57:41
投稿者: さー

お世話になります。
 
約2ヶ月程前に、こちらの掲示板にて、”グラフの範囲指定”について
質問させていただいたのですが、追加で再度、質問させてください。
 
テーブルに下記のようなデータベースがあります。
テーブル 名:データベース
日時列:日付/時刻型
No. 日時  分類
1 2013/4/1 りんご
2 2013/4/9  みかん
3 2013/5/2  りんご
 ・・・・
2000 2018/9/9 バナナ
 
このデータベースのデータを集計して、レポート上に積上げグラフを
作成したいです。
縦軸:分類の件数
横軸:月:Format([日時],"yyyy\年mm\月")
「集計範囲」というフォームを作り、横軸を1ヶ月単位で直近の13ヶ月
に指定をします。
 
この際にグラフの凡例を別のテーブルで、指定した順番に
するにはSQLビューをどのようにすればよいのでしょうか?

 
テーブル名:並び替え
No. 分類
1 バナナ
2 りんご
3 みかん
↑レポート上のグラフの凡例をこの順番(バナナ、りんご、みかん)に指定したいです。
 
SQLビュー
------------------------------------------------------------
PARAMETERS [Forms]![集計範囲]![年月] DateTime;
TRANSFORM Count ([データベース].分類) AS 分類のカウント
SELECT Format ([日時],"yyyy\年mm\月") AS 年月
FROM データベース
WHERE ((([データベース].日時) Between DateSerial(Year([Forms]![集計範囲]![年月]),Month([Forms]![集計範囲]![年月]-12,1)And
DateSerial(Year([Forms]![集計範囲]![年月]),Month([Forms]![集計範囲]![年月])+1,0)))
GROUP BY (Format([日時],"yyyy\年mm\月"))
PIVOT [データベース].分類;
 
 
お手数をおかけいたしますが、分かる方がいらっしゃいましたら、
教えてください。
よろしくお願いいたします。

回答
投稿日時: 18/11/02 09:35:47
投稿者: Suzu

こんにちは。
 
試せていませんが、並べ替えと言えば ORDER BY 句 試されましたか?

回答
投稿日時: 18/11/02 10:13:17
投稿者: sk

引用:
この際にグラフの凡例を別のテーブルで、指定した順番に
するにはSQLビューをどのようにすればよいのでしょうか?

引用:
テーブル名:並び替え
No. 分類
1 バナナ
2 りんご
3 みかん

引用:
PARAMETERS [Forms]![集計範囲]![年月] DateTime;
TRANSFORM Count ([データベース].分類) AS 分類のカウント
SELECT Format ([日時],"yyyy\年mm\月") AS 年月
FROM データベース
WHERE ((([データベース].日時) Between DateSerial(Year([Forms]![集計範囲]![年月]),Month([Forms]![集計範囲]![年月]-12,1)And
DateSerial(Year([Forms]![集計範囲]![年月]),Month([Forms]![集計範囲]![年月])+1,0)))
GROUP BY (Format([日時],"yyyy\年mm\月"))
PIVOT [データベース].分類;

PIVOT 句で指定された列見出しとなるフィールドに対しては、
ORDER BY 句などによって並べ替え順を指定することは出来ません。
(暗黙的に[分類]の昇順に列が並ぶ)
 
例えば、次のように PIVOT 句の後ろに IN 句を追加して
列見出しを固定させることならば一応は可能です。
 
( SQL ビュー)
-------------------------------------------------------------
PARAMETERS [Forms]![集計範囲]![年月] DateTime;
TRANSFORM Count ([データベース].分類) AS 分類のカウント
SELECT Format ([日時],"yyyy\年mm\月") AS 年月
FROM データベース
WHERE ((([データベース].日時) Between DateSerial(Year([Forms]![集計範囲]![年月]),Month([Forms]![集計範囲]![年月]-12,1)And
DateSerial(Year([Forms]![集計範囲]![年月]),Month([Forms]![集計範囲]![年月])+1,0)))
GROUP BY (Format([日時],"yyyy\年mm\月"))
PIVOT [データベース].分類 IN ("バナナ","りんご","みかん");
-------------------------------------------------------------
 
但しこの場合、
 
・[分類]の値が "バナナ", "りんご", "みかん" の
 どれでもないレコードは、PIVOT の対象に含まれない。
 例えば、[分類]の値が "ぶどう" であるレコードが
 テーブル[データベース]に存在していても
 "ぶどう" という列は表示されない。
 
・[分類]の値が "バナナ" であるレコードが
 テーブル[データベース]に 1 件もなくても、
 必ず[バナナ]という列が表示される。
 
といった状態になります。
 
それで問題がないのであれば、上記の通りに
列見出しを指定なさればよろしいでしょう。
 
あくまでも「列見出しは可変にしたい」かつ
「列見出しの並べ替え順のキーは[分類]とは別のフィールドにしたい」
ということであれば、例えば VBA によってクロス集計クエリを
書き換える(その流れで IN 句のリストを動的に生成する)
仕組みを作ることになるでしょう。

投稿日時: 18/11/02 21:25:15
投稿者: さー

Suzu様、sk様
 
お世話になります。回答をいただきありがとうございました。
 
sk様に教えていただいた、

引用:
IN ("バナナ","りんご","みかん");

にて、凡例の並び替えができました。私のやりたいことに
ぴったりの回答です。
 
引用:
・[分類]の値が "バナナ", "りんご", "みかん" の
 どれでもないレコードは、PIVOT の対象に含まれない。
  例えば、[分類]の値が "ぶどう" であるレコードが
 テーブル[データベース]に存在していても
 "ぶどう" という列は表示されない。

分類列にはあらかじめ指定した項目しか入らない(ぶどうが
入ることはない)ので、問題ないです。
 
引用:
・[分類]の値が "バナナ" であるレコードが
 テーブル[データベース]に 1 件もなくても、
  必ず[バナナ]という列が表示される。

全く問題ないです。むしろ、データベースに1件も
ない場合も[バナナ]という列が表示されたほうが
よいです。
 
引用:
PIVOT 句で指定された列見出しとなるフィールドに対しては、
ORDER BY 句などによって並べ替え順を指定することは出来ません。

全く知らず、びっくりでした。勉強になりました。
 
また分からないことがあった際は、こちらの掲示板にて、ご相談させて
いただけたらと思います。
よろしくお願いいたします。