• 締切済み

3テーブルの外部結合

3テーブルよりを以下の条件で1つのSELECT文で集計したいのですが可能でしょうか?  ・A_TBLのA単位でB_TBLのNYUKAとC_TBLのSYUKAを集計 <<A_TBL>>   <<B_TBL>>     <<C_TBL>> A  STOCK   B  A NYUKA   C  A SYUKA a01  100    b01 a02 10   c01 a03 10 a02  200    b02 a01 20   c02 a01 20 a03  300    b03 a01 10   c03 a05 10 a04  400    b04 a03 30   c04 a01 30 a05  500    b05 a05 30   c05 a03 20            b06 a02 20   c06 a01 10            b07 a01 10   c07 a03 50 外部結合 SELECT a.A,a.STOCK,SUM(b.NYUKA) AS SUM_NYUKA,SUM(c.SYUKA) AS SUM_SYUKA FROM A_TBL AS a". LEFT OUTER JOIN B_TBL AS b ON a.A=b.A LEFT OUTER JOIN C_TBL AS c ON a.A=c.A". GROUP BY a.A でうまくいきません。3つ以上のテーブルの外部結合の記述が間違っているのはわかるのですが、 どのように記述すればよいか、ネットで検索してもわかりませんでした。 宜しくお願い致します。

  • MySQL
  • 回答数4
  • ありがとう数3

みんなの回答

回答No.4

>3テーブルにすると、交差結合に近い結果になってしまいます。 当然ですが、aとbの結合結果に、cを外部結合するのだから、そうなりますよね。 aに対して、b,cが一対になるように事前集約して、外部結合すれば良いでしょう。 select a.A,a.STOK,x.SUM_NYUKA,y.SUM_SYUKA from A_TBL as a left join (select A,sum(NYUKA) as SUM_NYUKA from B_TBL group by A) as x on (a.A=x.A) left join (select A,sum(SYUKA) as SUM_SYUKA from C_TBL group by A) as y on (a.A=y.A) order by a.A

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

っていうか単純に集計してから合わせればよいでしょう。 CREATE TEMPORARY TABLE TEMP_B SELECT A,SUM(NYUKA) AS SUM_NYUKA FROM B_TBL GROUP BY A; CREATE TEMPORARY TABLE TEMP_C SELECT A,SUM(SYUKA) AS SUM_SYUKA FROM C_TBL GROUP BY A; SELECT a.A ,STOCK ,SUM_NYUKA ,SUM_SYUKA FROM A_TBL AS a LEFT JOIN TEMP_B on a.A=TEMP_B.A LEFT JOIN TEMP_C on a.A=TEMP_C.A

回答No.2

SELECT ab.A ,ab.STOCK ,ab.SUM_NYUKA ,ac.SUM_SYUKA FROM ( SELECT a.A ,a.STOCK ,SUM(b.NYUKA) AS SUM_NYUKA FROM A_TBL AS a LEFT OUTER JOIN B_TBL AS b ON a.A=b.A GROUP BY a.A ,a.STOCK ) ab INNER JOIN ( SELECT a.A ,a.STOCK ,SUM(c.SYUKA) AS SUM_SYUKA FROM A_TBL AS a LEFT OUTER JOIN C_TBL AS c ON a.A=c.A GROUP BY a.A ,a.STOCK ) ac ON ab.A = ac.A AND ab.STOCK = ac.STOCK GROUP BY ab.A ,ab.STOCK -------------------------- こんなのどうですかね?実行してないので、構文ミスがあるかもなので、ご了承ください。

回答No.1

ぱっとみ、 >GROUP BY a.A に、「a.STOCK」を追加してやればいけそうな気がしますが。

ryota777
質問者

補足

早速のご回答有難う御座います。 GROUP BY a.A,a.STOCKでは結果は同じでした。 ちなみに、 SELECT a.A,a.STOCK,SUM(b.NYUKA) AS SUM_NYUKA FROM A_TBL AS a". LEFT OUTER JOIN B_TBL AS b ON a.A=b.A GROUP BY a.A と2テーブルの外部結合だとうまくいきますが、 3テーブルにすると、交差結合に近い結果になってしまいます。

関連するQ&A

  • 3テーブル外部結合方法について

    3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・

  • 複数テーブルを結合するには?

    OS:WINDOWSXP SP2 ORACLE:Oracle9i Enterprise Edition Release 9.2.0.1.0 A, B, Cというテーブルがあるとします。 それぞれのテーブルには XXカラムと YYカラムがあるとします。 2つのテーブルを結合させるには、以下のSQL文を記述すれば良いと考えています。 SELECT A.*,B.* FROM A JOIN B ON A.XX = B.XX 3つのテーブルを結合するには、以下のSQL文を記述しています。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX JOIN C ON A.XX = C.XX 但し、この記述方法でいきますと、Cテーブルを右側外部結合に指定した場合のみ、 ORA-00904 "C" 無効な識別子です。 というエラーメッセージが表示されます。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX RIGHT OUTER JOIN C (←LEFT OUTER、FULL OUTER)なら通ります) ON A.XX = C.XX 何故、右側外部結合のみ不正となるのか不明であり、解決策が見つかりません。 複数のテーブルを結合する為のSQL文の記述方法を教えて頂けますでしょうか?

  • 集計されたテーブルの結合

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

    • ベストアンサー
    • MySQL
  • 多段外部結合はできる?

    mysqlにおいて、多段の外部結合はできるのか今模索しております。 例えば、A、B、Cと3つテーブルがあった場合に、 「Aに対してBを外部結合」 「Bに対してCを外部結合」 としたいのですが、どうやってもCテーブルの値が取得できず常にNULLになっている状態です。 例として、以下の条件で実行すると、Cテーブルの値が取得できません。 ---- (テーブル) A [id, name, b_id] ※b_idはB.idの外部キー B [id, name, c_id] ※c_idはC.idの外部キー C [id, name] (クエリ) select A.name, B.name, C.name from A left join B on (A.b_id = B.id) left join C on (B.c_id = C.id) ---- どうやったらうまく取得できますか?もしくはできないのでしょうか? ご存知の方、ご教授ください。

    • ベストアンサー
    • MySQL
  • 固定値を含む結合と複数テーブルの結合について

    「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。 最近oracleを使い始めてSQLで表の結合を書く場面があるんですが LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。 LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。 それが嫌で(+)を使っていたんですが 今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。 (AテーブルとBテーブル、AテーブルとCテーブルなど?) こういう場合はどうすれば良いのでしょうか? とりあえず副参照をFROMに指定して対処してるんですが 何かきちんとした書き方があるのでしょうか?誰か教えて下さい。

  • テーブルの結合について質問です。

    テーブルの結合について質問です。 テーブル名:SHOSAI SELECT T1.TIMESTAMP AS 登録, T1.UPDATE AS 更新, T2.CONTENT AS コード, . . . FROM SHOSAI T1 LEFT OUTER JOIN X_CODE T2 ON T1.Y_CODE = T2.CODE テーブル名:SHOSAI SELECT T1.TIMESTAMP AS 登録, T1.UPDATE AS 更新, T2.CONTENT AS コード, T1.BANGO AS 番号, T3.CONTENT AS 曜日, . . . FROM JOHO T1 LEFT OUTER JOIN X_CODE T2 ON T1.Y_CODE = T2.CODE LEFT OUTER JOIN H_CODE T3 ON T1.J_CODE = T3.CODE . . . この2つのテーブルを結合したいのですが それぞれのデータ数が300あり SELECT*で呼びだしてもCSEはエラーとなってしまいます。 項目名を選定してプログラムを組んでもうまくできません。 良い方法があれば教えてください。

    • ベストアンサー
    • MySQL
  • 複数のテーブルを外部結合する

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

  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどで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 よろしければアドバイスお願いします。

  • テーブル結合で、結合フィールドをWHERE句に用いた時に、結合フィールドのデータがNULLになってしまう。

    MySQL 4.0.24-standard + PHP Version 4.3.11 を使用しています。 下記のような table_a, table_b があり、idフィールドで外部結合させています。 table_a id|value ------- 1 | 0 2 | 1 table_b id|name ------- 1 | A 2 | B SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b; result id|value|name -------------- 1 | 0 | A 2 | 1 | B しかし、下記のクエリでは、このようにidがNULLになってしまいます。 SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b WHERE table_a.id = 1; result id |value|name -------------- NULL| 0 | A 以下のような結果を得たいのですが、どうすれば良いのでしょうか? result id|value|name -------------- 1 | 0 | A

    • ベストアンサー
    • MySQL
  • テーブル結合について、下記SQLをANSI結合の書き方で表したい。

    テーブル結合について、下記SQLをANSI結合の書き方で表したい。 select * from (select key from A union select key from B union select key from C) X, A,B,C where X.key=A.key(+) and X.key=B.key(+) and X.key=C.key(+) このSQLをANSI結合の記述で書きたいのですが、 (+)での結合文になれておらず試行錯誤しております。 下記のようなのかなとは模索しておりますが、 手元に実行環境がなくわかりません。 また、要所気付く点などありましたら、ご指摘願います。 select A.*, B.*, C.* from (select key from A union select key from B union select key from C) X, LEFT JOIN A ON X.key=A.key LEFT JOIN B ON X.key=B.key LEFT JOIN C ON X.key=C.key