• ベストアンサー

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

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

  • 複数テーブルの結合

    マスターテーブル1つと、子テーブルが複数存在して子テーブルにはマスターテーブルのidを格納するフィールドがあり参照しなくなったときにはそのidを消去するといったデータベースがあったときにマスターIDごとに子テーブルのどれか1つでも参照していればカウントするみたいなSQLをつくりたいんですが select count(m.id) from master m inner join a on m.id = a.m_id inner join b on m.id = b.m_id inner join c on m.id = c.m_id group by m.id みたいなSQLだとAにデータが存在しなければB以降に存在しても期待した結果が出力されません。A、B、Cいずれかのm_idとマスター側のIDが等しければカウントするという出力をするためにはどのように書けばいいんでしょうか。 わかりづらい説明で申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • 2テーブルが同じユーザテーブル参照するときの結合

    2つのテーブルで、同じユーザテーブルを参照してデータ取得したいのですが、 どうやって結合すれば良いのでしょうか? ■概要 ・ユーザがアクションに挑戦すると、結果を表示 ・その際、「アクション作成者」と「アクション挑戦者(ユーザ)」を表示したい ※「作成者」「挑戦者」は、同じ「user」テーブルで管理したい ■3テーブル ・「result」「action」「user」 ・「result」「action」テーブルには、それぞれ「user_id」カラムがある ・「result」テーブルには、「action_id」カラムがある。1対多? ■知りたいこと ・一気にまとめて一覧として取得する方法 ・最終的に「結果」と、「result」「action」それぞれに対応した「user」テーブルの「name」カラムを取得したい ■試してみたこと ・これだと「挑戦者名」が取得できない       SELECT *        FROM result r         LEFT JOIN `action` a ON r.`action_id` = a.`id`         LEFT JOIN `user` u ON r.`user_id` = u.`id` ・これだと「挑戦者」のユーザIDしか取得できない       SELECT *,a.user_id AS actionuser_id        FROM result r         LEFT JOIN `action` a ON r.`action_id` = a.`id`         LEFT JOIN `user` u ON a.`user_id` = u.`id`

    • ベストアンサー
    • MySQL
  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。

  • 異なるデータベース間のテーブル結合

    DB名:db1 TABLE名:得意先マスタ DB名:db2 TABLE名:ユーザマスタ 以上のように、異なるデータベースに存在する2つのテーブルをLEFT JOINさせたいです。 結合条件は ユーザマスタ.得意先コード = 得意先マスタ.得意先コード とします。 この場合の結合方法を教えてください。 以下のようなSQL文を書いても駄目でした。 SELECT * FROM db1.ADMINISTRATOR.得意先マスタ AS  得意先マスタ   LEFT OUTER JOIN db2.ADMINISTRATOR.ユーザマスタ AS ユーザマスタ ON ユーザマスタ.得意先コード = 得意先マスタ.得意先コード よろしくお願いいたします。

  • テーブルの結合について

    親テーブルに対して子テーブルが複数あるときの結合方法がわかりません。 テーブル2、3はそれぞれマスタテーブルの値を格納しています。 具体的には4つのテーブルを結合しテーブル1のname項目、テーブル2のtest項目、area_id、pref_idで検索をしたいです。 right joinで結合してみましたが、テーブル3、4でテーブル2のtest_idを2回参照するのでエラーがでてから先に進めない状況です。 他の回答を読んだのですができなかったので質問させてください。 お分かりの方教えてください。 よろしくお願いいたします。 [teble1] ID | name 1 佐々木 2 鈴木 3 田中 [teble2] test_id | ID(table1の値) | test 1 1       テスト1 2 1       テスト2 3 2       テスト3 [teble3] test_id | area_id 1    1 1    4 2    3 [teble4] test_id | pref_id 1    1 2    2 2    5 3    2 バージョンは4.0.27です。

    • ベストアンサー
    • MySQL
  • 集計されたテーブルの結合

    SUM、AVGなどで集計された(group byを使って)テーブルを、LEFT JOINで結合するにはどうしたらいいですか?

    • ベストアンサー
    • MySQL
  • 複数DBの結合について

    下記のような構成のDBがあり 全部のTBを結合したいのですが SELECT FROM pears AS pear LEFT JOIN users AS man ON (pear.man_id = man.id) LEFT JOIN users AS woman ON (pear.woman_id = woman.id) USERとPEARの結合は出来たものの HOBYの結合が出来ないので、どうすればよいか よろしくお願いいたします。 TABLE hobys id hoby 1 baseball 2 tennis 3 soccer 4 basketball TABLE users id name hoby_id 1 aaa 1 2 bbb 2 3 ccc 3 4 ddd 4 TABLE pears id man_id woman_id 1 1 2 2 3 4 環境Mysql 4.0.27

    • ベストアンサー
    • MySQL
  • MySQL テーブルの結合

    顧客ごとにテーブルを作る香ばしいプログラムのSQL文を書くことになりました。 user_0001 user_0002 user_0003 user_0004 user_0005 といった具合にどんどん増えていきます。 カラムは仮に id, name, tel が入っているとします。 プログラムの修正は行えません。 通常JOIN句でテーブルの結合を行うと思うのですが、「user_」という文字列を含んでいるテーブルを全て結合せよ!みたいな命令文はSQLで書けるのでしょうか? 無理、無駄、素直にプログラムで出せ、というアドバイスでも構いませんのでよろしくお願いします。

    • ベストアンサー
    • MySQL
  • 助けて>< 3つのテーブルで簡単な集計

    下記のような3種類のテーブルがあります。 これを集計して、指定したユーザーの指定月のアクセス日時と売上げ金額を表にしたいと思っています。 こんな感じに。 +--+--------+----------+-------+-----+ | id | username| date   | access | sales | +--+--------+----------+-------+-----+ | 1 | admin | 2010-11-13 |   2 | 5000 | | 1 | admin | 2010-11-14 |   2 | 5000 | | 1 | admin | 2010-11-15 |  1 | 20000 | +--+--------+----------+-------+-----+ SELECT u.id AS id, u.username, DATE(a.created_at) AS date, COUNT(*) AS access, SUM(s.amount) AS sales FROM sf_guard_user u INNER JOIN sales s ON u.username = s.user_id LEFT JOIN access_log a ON u.username = a.user_id WHERE (u.username = 'admin' AND a.created_at > '2010-11-01 00:00:00' AND a.created_at < '2010-11-30 23:59:59') GROUP BY date ORDER BY a.created_at; とやってみたのですがダメでした;; ■ユーザー情報テーブル mysql> select id,username from user; +--+---------+ | id | username | +--+---------+ | 1 | admin   | +--+---------+ ■アクセスログテーブル mysql> select * from access_log; +--+-------+--------+------------------+ | id | user_id | ip     | created_at      | +--+-------+--------+------------------+ | 1 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | | 2 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | | 3 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | | 4 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | | 5 | admin  | 127.0.0.1 | 2010-11-15 21:56:54 | +--+-------+--------+------------------+ ■売上げ金額テーブル mysql> select * from sales; +--+-------+------+------------------+ | id | user_id | amount| created_at      | +--+-------+------+------------------+ | 1 | admin  |  5000 | 2010-11-13 21:56:54 | | 2 | admin  |  5000 | 2010-11-14 21:56:54 | | 3 | admin  |  5000 | 2010-11-15 21:56:54 | | 4 | admin  |  5000 | 2010-11-15 21:56:54 | +--+-------+------+------------------+

    • ベストアンサー
    • MySQL
  • codeigniterで3つのテーブルからデータ

    codeigniterで3つのテーブルからデータ取得したいのですが、どうやるのでしょうか? ・メインテーブルm … uid、pidカラム  ・ユーザーテーブルu … uidカラム ・都道府県テーブルp … pidカラム m.uid=u.uid、かつ、m.pid=p.pidてのをモデルに書きたいです。 2つまで結合するやり方だと、 $this->db->join('u', 'm.uid=u.uid でいけたのですが、 3つ結合する時は、どうやるのでしょうか? db->joinを使ってどうにか出来るのでしょうか? それとも別のメソッドを利用するのでしょうか?

    • ベストアンサー
    • PHP