• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:集計表の外部結合)

SQLで集計表の外部結合の方法とは?

このQ&Aのポイント
  • SQL SERVER2008r2のManagement StudioでSQLを書いている際に、集計のやり方がよくわからない場合にどうすればいいか教えてください。
  • 上記の要件を満たすためには、伝票日付を限定してTT売上伝票テーブルを集計し、店舗名と店舗部門名を表示する必要があります。
  • TM店舗テーブルとTM店舗部門テーブルとの外部結合を使って、TT売上伝票テーブルの店舗CDと店舗部門CDを紐付けることができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.1

まず、問題はないというところから。。。 >SELECT >伝票日付, >店舗CD, >店舗部門CD, >SUM(伝票合計) AS 日別合計 >FROM TT売上伝票 >GROUP BY 伝票日付,店舗CD,店舗部門CD >HAVING 伝票日付 BETWEEN '2014-04-21' AND '2014-05-20' AND 店舗CD IN(1,2,3,4) >ORDER BY 伝票日付,店舗CD,店舗部門CD HAVING句は抽出結果に対して処理されます。 ということで、10年分データがあったら、10年分の全件集計した結果に対して 伝票日付の条件にあうデータを探します。⇒非常に遅い。 普通は、WHERE句を使います。(抽出対象に対して処理されます) WHERE 伝票日付 BETWEEN '2014-04-21' AND '2014-05-20' AND 店舗CD IN(1,2,3,4) という感じです。⇒ 何年分のデータがあろうが、1か月分を対象として抜き出してから集計されます。 (group by の手前に書いてください) >リレーションし、店舗名、店舗部門名を表示したいのですが、書き方が分かりません。 Unionについてから。 unionは複数のselectの結果を合わせて出力するときに使います。 設計的には不適切ですが、例えば、1週単位で別のテーブルに持っているなら SELECT 伝票日付,店舗CD,店舗部門CD,SUM(伝票合計) AS 日別合計 FROM TT売上伝票4月第3週 WHERE 伝票日付 BETWEEN '2014-04-21' AND '2014-05-20' AND 店舗CD IN(1,2,3,4) GROUP BY 伝票日付,店舗CD,店舗部門CD union SELECT 伝票日付,店舗CD,店舗部門CD,SUM(伝票合計) AS 日別合計 FROM TT売上伝票4月第4週 WHERE 伝票日付 BETWEEN '2014-04-21' AND '2014-05-20' AND 店舗CD IN(1,2,3,4) GROUP BY 伝票日付,店舗CD,店舗部門CD union ・・・ という風に記述して、4月第3週から5月第2週までのデータをそれぞれのテーブルから取得します。 (例が悪いと思っている理由は、通常は年単位のテーブルや別々の種類のテーブルから  unionするのが一般的なため。) で、望みのものは、 SELECT d.伝票日付, d.店舗CD, t.店舗名, d.店舗部門CD, b.店舗部門名, SUM(d.伝票合計) AS 日別合計 FROM TT売上伝票 d JOIN TM店舗 t t.店舗CD=d.店舗CD JOIN TM店舗部門 b b.店舗部門CD=d.店舗部門CD where 伝票日付 BETWEEN '2014-04-21' AND '2014-05-20' AND 店舗CD IN(1,2,3,4) GROUP BY 伝票日付,店舗CD,店舗部門CD ORDER BY 伝票日付,店舗CD,店舗部門CD と、結合した結果を集計するか、 SELECT x.伝票日付, x.店舗CD, t.店舗名, x.店舗部門CD, b.店舗部門名, x.日別合計 FROM ( SELECT 伝票日付,店舗CD,店舗部門CD,SUM(伝票合計) AS 日別合計 FROM TT売上伝票 WHERE 伝票日付 BETWEEN '2014-04-21' AND '2014-05-20' AND 店舗CD IN(1,2,3,4) GROUP BY 伝票日付,店舗CD,店舗部門CD ) x JOIN TM店舗 t t.店舗CD=x.店舗CD JOIN TM店舗部門 b b.店舗部門CD=x.店舗部門CD ORDER BY x.伝票日付,x.店舗CD,x.店舗部門CD と集計した結果にJOINするかします。

sujinosuke00
質問者

お礼

Siegrune様 詳しい回答ありがとうございます。 まさに、私が知りたかった事でした。 また、GROUP BY(集計)から、抽出の場合は必ず "HAVING"で行うと思っていたので、先に"WHERE"で抽出できるとは考えてもいませんでした。 あわせて、"FROM"以外でも、エイリアスがかけるという事も知りませんでした。 お教えいただいた内容を、よく理解し今後の参考にさせて頂きます。 ありがとうございました。