- ベストアンサー
複数のテーブルを外部結合する
複数のテーブルを外部結合してSUMをとってきたいとき、SQLServerではどのような結合にすればよいのでしょう。 一対一の関係なら「LEFT JOIN」を使って「FROM テーブルA LEFT JOIN テーブルB ON テーブルA.フィールド = テーブルB.フィールド」ができますが、一対複数の関係で書き方がよくわからず、かなり困っています。 例) ユーザーマスター ・ユーザーID ・ユーザー氏名 ○月売上テーブル←○には1~12が入る ・ユーザーID ・売上金額 欲しいデータは ・ユーザーID ・ユーザー氏名 ・SUM(1月売上テーブル.売上金額) 1月 ・SUM(2月売上テーブル.売上金額) 2月 ・SUM(3月売上テーブル.売上金額) 3月 以降、12月まで続く ORACLEだと↓のやり方で、 ・ユーザーマスターはすべて ・各月の売上テーブルはユーザーID毎に集計(外部結合) を出力してくれるのですが…。 SELECT u.ユーザーID,u.ユーザー氏名, SUM(m1.売上金額),SUM(m2.売上金額),SUM(m3.売上金額),,, FROM ユーザーマスター u, 1月売上テーブル m1, 2月売上テーブル m2, 3月売上テーブル m3,,, WHERE u.ユーザーID=m1.ユーザーID(+) AND u.ユーザーID=m2.ユーザーID(+) AND u.ユーザーID=m3.ユーザーID(+),,, GROUP BY u.ユーザーID,u.ユーザー氏名 ORDER BY u.ユーザーID,u.ユーザー氏名
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
普通の外部結合でしたら、LEFT JOIN を使用した以下のようなSQLで抽出できませんか? SELECT u.ユーザーID,u.ユーザー氏名, SUM(m1.売上金額),SUM(m2.売上金額),SUM(m3.売上金額),,, FROM ユーザーマスター u LEFT JOIN 1月売上テーブル m1 ON u.ユーザーID=m1.ユーザーID LEFT JOIN 2月売上テーブル m2 ON u.ユーザーID=m2.ユーザーID LEFT JOIN 3月売上テーブル m3 ON u.ユーザーID=m3.ユーザーID : GROUP BY u.ユーザーID,u.ユーザー氏名 ORDER BY u.ユーザーID,u.ユーザー氏名 ※一対一の関係の場合は本来はLEFT JOINではなく、INNNER JOINが正しいかと思うのですが。
その他の回答 (1)
- kikaida-
- ベストアンサー率69% (37/53)
これでいけるでしょう。 SELECT u.ユーザーID,u.ユーザー氏名, m1.売上,m2.売上,・・・ from ユーザーマスター u left join (select ユーザーID,sum(売上金額) as 金額 from 1月売上テーブル group by ユーザーID) m1 on u.ユーザーID=m1.ユーザーID ・・・
お礼
回答ありとうございます。サブクエリーを使うやり方も今度試してみます。
お礼
回答ありがとうございます。このやり方で実現できました。 ちなみに、テーブルAとテーブルBは内部結合、テーブルAとテーブルa1,a2およびテーブルBとテーブルb1,b2は外部結合(質問と同じ)という場合、 FROM テーブルA a JOIN テーブルB b ON a.ID=b.ID --1 a LEFT JOIN テーブルa1 a1 ON a.ID=a1.ID --2 LEFT JOIN テーブルa2 a2 ON a.ID=a2.ID --3 b LEFT JOIN テーブルb1 b1 ON b.ID=b1.ID --4 LEFT JOIN テーブルb2 b2 ON b.ID=b2.ID --5 と並べて書いてもいいでしょうか? それとも1と2,3と4の間にANDか何かいりますか?