• ベストアンサー

複数のテーブルを外部結合する

複数のテーブルを外部結合して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.ユーザー氏名

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

  • ベストアンサー
  • asahina02
  • ベストアンサー率47% (95/202)
回答No.1

普通の外部結合でしたら、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が正しいかと思うのですが。

lovesens
質問者

お礼

回答ありがとうございます。このやり方で実現できました。 ちなみに、テーブル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か何かいりますか?

その他の回答 (1)

  • kikaida-
  • ベストアンサー率69% (37/53)
回答No.2

これでいけるでしょう。 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 ・・・

lovesens
質問者

お礼

回答ありとうございます。サブクエリーを使うやり方も今度試してみます。

関連するQ&A