今、以下のようなAccessのファイルがあります。
https://xfs.jp/VV33Hg
このAccessファイル内の2つのテーブル「T_注文履歴」と「T_メニュー一覧」に対して、下記のSQLを実行したのですが。
-----------
select tb2.商品コード as 商品,count(tb2.商品コード) as 付与ポイント
from (select tb1.商品コード,tb1.店舗
from (select 商品コード,店舗ID as 店舗,メニューID
from T_注文履歴
group by 商品コード,店舗ID,メニューID
union all
select 商品コード,店舗,メニューID
from T_メニュー一覧
group by 商品コード,店舗,メニューID
) as tb1
group by tb1.商品コード,tb1.店舗
) as tb2
group by tb2.商品コード
-----------
「パラメーターの入力 店舗」と、入力を求められてしまいます。
そしてこの画像 https://f.hatena.ne.jp/moon-fondu/20210410103743 のように、SQLの集計結果が、少し違う結果となってしまいます。
中のサブクエリ、
-----------
select 商品コード,店舗ID as 店舗,メニューID
from T_注文履歴
group by 商品コード,店舗ID,メニューID
union all
select 商品コード,店舗,メニューID
from T_メニュー一覧
group by 商品コード,店舗,メニューID
-----------
を実行してみますと。
こちら https://f.hatena.ne.jp/moon-fondu/20210410105303 のように「店舗」フィールドにデータが入ってない行がなぜか、9行出てきます。
フィールドにデータが不足している?と思ったのですが。from句で呼び出している「T_注文履歴」「T_メニュー一覧」テーブルには、データは入っていてますし。
不足しているセルを含む「店舗ID」フィールド(「店舗」フィールドの元の列)には、こちら https://f.hatena.ne.jp/moon-fondu/20210410104224 のように、データを入れてますし。
なぜパラメーターの入力を求められるのか、不具合が起きるのか、判りかねておりまして。
原因と対処法をお教えいただけますと有難いです。
よろしくお願い致します<m(__)m>
とりあえず、店舗の入力を促されている件は、union の2番目の select で T_メニュー一覧の列にない「店舗」が登場しているからです。
修正するとしたら、こんな感じ。
SELECT tb2.商品コード AS 商品, count(tb2.商品コード) AS 付与ポイント FROM (select tb1.商品コード,tb1.店舗 from (select 商品コード,店舗ID as 店舗,メニューID from T_注文履歴 group by 商品コード,店舗ID,メニューID union all select 商品コード,店舗ID,メニューID ★ここと from T_メニュー一覧 group by 商品コード,店舗ID,メニューID ★ここ ) as tb1 group by tb1.商品コード,tb1.店舗 ) AS tb2 GROUP BY tb2.商品コード;
union の前後の SQL は、お互いのことを知らないので、1番目の select で as で名前を付けたことを、2番目の select は知りません。
「集計結果が少し違う」については、どんな集計をやりたいのかが分からないと何とも言えません。
tb2 の名がついている副問い合わせで、商品コードで group by しちゃってますから、その結果はそれぞれの商品コートにつき 1行です。
それを count(tb2.商品コード) しても、値は 1 にしかならず。
勝手に想像すると、売れた商品の種類の数だけポイントが付くのでしょうか(いや、例題にしても不自然か
仮にそうだとして、T_注文履歴と T_メニュー一覧を union で結合しているところから理解できません。
注文履歴のなにがしかを集計したいのだろうというのは想像つきますけれど、そこから先が分かりません。
まあ、何かの実物を質問用に書き替えているのは分かりますけれど、ちょっと例としては分かりにくいです。
とりあえず、店舗の入力を促されている件は、union の2番目の select で T_メニュー一覧の列にない「店舗」が登場しているからです。
修正するとしたら、こんな感じ。
SELECT tb2.商品コード AS 商品, count(tb2.商品コード) AS 付与ポイント FROM (select tb1.商品コード,tb1.店舗 from (select 商品コード,店舗ID as 店舗,メニューID from T_注文履歴 group by 商品コード,店舗ID,メニューID union all select 商品コード,店舗ID,メニューID ★ここと from T_メニュー一覧 group by 商品コード,店舗ID,メニューID ★ここ ) as tb1 group by tb1.商品コード,tb1.店舗 ) AS tb2 GROUP BY tb2.商品コード;
union の前後の SQL は、お互いのことを知らないので、1番目の select で as で名前を付けたことを、2番目の select は知りません。
「集計結果が少し違う」については、どんな集計をやりたいのかが分からないと何とも言えません。
tb2 の名がついている副問い合わせで、商品コードで group by しちゃってますから、その結果はそれぞれの商品コートにつき 1行です。
それを count(tb2.商品コード) しても、値は 1 にしかならず。
勝手に想像すると、売れた商品の種類の数だけポイントが付くのでしょうか(いや、例題にしても不自然か
仮にそうだとして、T_注文履歴と T_メニュー一覧を union で結合しているところから理解できません。
注文履歴のなにがしかを集計したいのだろうというのは想像つきますけれど、そこから先が分かりません。
まあ、何かの実物を質問用に書き替えているのは分かりますけれど、ちょっと例としては分かりにくいです。