• ベストアンサー
  • 困ってます

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

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

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数134
  • ありがとう数2

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

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

一度テンポラリにデータを流し込み、テンポラリをジョインします create temporary table temptable select category,sum(data) as sumdata from table2 group by category; select t1.id,t2.sumdata from table1 as t1 left join temptable as t2 on t1.id=t2.category

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 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つ以上のテーブルの外部結合の記述が間違っているのはわかるのですが、 どのように記述すればよいか、ネットで検索してもわかりませんでした。 宜しくお願い致します。

  • PL/SQLでの、集計→結合→集計の仕方

    いつもお世話になってます。 以前こちらで質問をさせていただいたのですが、 http://soudan1.biglobe.ne.jp/qa5076670.html さらに分からないことが出てきたので、また質問させていただきます 【テーブル1】 (年月日) (班) (回数) (秒) (種類) 20090401|aaa| 10| 100 A 20090401|aaa| 20| 200 A 20090501|bbb| 10| 150 B 20090501|bbb| 20| 100 B 20090401|ccc| 10| 100 C 20090401|ccc| 30| 250 C 20090401|ddd| 15| 200 A : : : まずこれを集計し、件数を追加して (班) (回数) (秒) (件) (種類) aaa| 30| 300| 2 A bbb| 30| 250| 2 B ccc| 40| 350| 2 C ddd| 15| 200| 1 A : : : : というようにまとめ、 【テーブル2】 (年月) (班) (円) 200904| aaa| 1000 200905| bbb| 1500 200904| ccc| 2000 200904| ddd| 1200 : : : というテーブルと結合して (年月) (班) (回数) (秒) (円×件) (種類) 200904| aaa| 30| 300| 2000 A 200905| bbb| 30| 250| 3000 B 200904| ccc| 40| 350| 4000 C 200904| ddd| 15| 200| 1200 A : : : : : とするのが前回までで ここから更に種類で集計をして (年月) (回数) (秒) (円×件) (種類) 200904 | 45| 500| 3200| A 200905 | 30| 250| 3000| B 200904 | 40| 350| 4000| C としたいのですが、 SELECT テーブル2.年月, テーブル1集計.種類, sum(テーブル1集計.回数), sum(テーブル1集計.秒数), sum(テーブル1集計.件数 * テーブル2.円) FROM (SELECT 年月日, 班, 種類, sum(回数) 回数, sum(秒数) 秒数, count(*) 件数 FROM テーブル1 GROUP BY 班,種類,年月日) テーブル1集計,テーブル2 WHERE テーブル1集計.班=テーブル2.班 GROUP BY 種類,テーブル2.年月; としたところ、最終的に出力したいテーブルの集計結果の (回数) (秒) (円×件)が正しいものより多くなってしまいました。 長くなって申し分かりません。 どこが間違っているのか、わかる方いらっしゃいましたら 教えていただけないでしょうか??

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

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

その他の回答 (3)

  • 回答No.4

#1、#3回答者です。 #3の補足回答が一部不適切でした。 #1で「バージョン4.1か5.0以降なら」としたのは、#3で書いた「4.1以降」という意味ではなく、「4.1か5.0か、どちらで書ける様になったか不確か」という意味です。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 どちらにしても、バージョン4.0以前では出来ないんですね・・・残念です。 レンタルサーバー業者にバージョンアップの確認をしたら、「バージョン4.0までと4.1以降では仕様が大幅に変わるので今のところ予定は無い。」とのことでした。 テンポラリデータを作成する方法でやってみます。

  • 回答No.3

>「バージョン4.1か5.0以降なら、次のような書き方ができます。」と >ありましたが、その間、例えば、4.2などではできないということ >ですか? 日本語が変でしたね。すみません。 「バージョン4.1以降ならできる」という意味です。 select ~ from (select ~ from ~)という書き方が、その頃からできるようになっています。バージョン4.0系でも書けるかどうかは、把握できていません。 バージョン5以降なら、group byを使って集計する部分を、ビューにしてしまう方法もありますね。 古いバージョンなら、#2回答者さんの示している一時表(テンポラリ・テーブル)を使用する方法が簡単でしょう。

共感・感謝の気持ちを伝えよう!

  • 回答No.1

MySQLのバージョンは? バージョン4.1か5.0以降なら、次のような書き方ができます。 select x.c1,x.sum_c2,t2.c3 from (select c1,sum(c2) as sum_c2 from t1 group by c1) as x left join t2 on x.c1=t2.c1

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 レンタルサーバのMySQLを使用しているのですが、残念ながらバージョンは 4.0.24でした。もし、他に方法がありましたら教えていただければ幸いです。 それと、「バージョン4.1か5.0以降なら、次のような書き方ができます。」とありましたが、その間、例えば、4.2などではできないということですか?

関連するQ&A

  • テーブルの集計+結合

    MySQL+ PHPについて質問です。 商品リスト(テーブルA)から、商品名で関連付けられたユーザー評価(テーブルB)があったとします。 ユーザーが商品ページから評価を5段階でを入れれるようにしました。 商品一覧のページで商品リスト(テーブルA)を表示させ さらにユーザー評価の平均を一緒にテーブルAの商品名から関連付けるように表示させたいのですが、どうやったらいいのでしょうか。 イメージは下記の通りです。 --------------------------------------------------------------- 商品名(テーブルA) ∥ 商品説明(テーブルA) ∥ 商品ランク(テーブルB) --------------------------------------------------------------- オレンジ | おいしい | 評価5 --------------------------------------------------------------- りんご | おいしい | 評価4 --------------------------------------------------------------- 試したSQL文は以下の通りです。 "SELECT title, avg(rank) as avgrank FROM テーブルB group by title join テーブルA テーブルA .title = テーブルB.title"; 残念ながらエラーなのですが、正しくはどう書くのでしょうか。 単純にユーザーが1人であればそのまま結合できるのですが、同じタイトルのものの評価を平均しないといけないため、頭がおかしくなりそうです。

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

    以下の二つを実行すると、2 の方がかなり速いのですが理由が分かりません。 分かる方教えてもらっていいですか? DBはMYSQLでInoDBです。 ちなみに Aは1万件、B は10万件ほど 1 のSQL SELECT * FROM A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) B ON A.id = B.XXX WHERE ・・・ GROUP BY A.id 2 のSQL (SELECT * FROM A ・・・ GROUP BY ID ) A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) ON A.ID = B.XXX.ID

  • 違うDB間のテーブル結合について

    宜しくお願い致します。 同じDB内にあるテーブル同士はleft join等で結合できますが、違うDB間にあるテーブルを結合する事は可能でしょうか?

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

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

  • 3つ以上のテーブルを結合して絞り込むには?

    MySQL勉強中のものです。 初歩的な質問ですいませんが、 以下のような3つのテーブルがあります。 テーブルA(店名) A店 B店 C店 D店 テーブルB(販売品目) パソコン ビデオ 冷蔵庫 液晶テレビ デジカメ テーブルC(支払い方法) クレジットカード 銀行振り込み 代引き このデータから、テレビとビデオを販売していて かつクレジットカードに対応しているお店を検索したいと思うのですが、 どうもうまくいきません。 この場合、どのようにSQL文を組み立てればよいのでしょうか。 LEFT JOINで1つに結合すると、カラムごとにレコードが重複して GROUP BYでうまく絞り込めません。 そもそもテーブルの作り方を間違えているのでしょうか。 考え方のヒントだけでも結構ですのでよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 結合と集計、同一のステートメント上だとエラーになる

    PostgreSQL初心者です。 結合と集計、別々のsqlステートメントだと動くのですが、同一のステートメントに記述するとエラーになります。 どなたか教えていただけると大変助かります。 phpPgAdmin を利用しております。 =エラーになったsqlステートメント= SELECT "pointm"."usercd", Sum("pointm"."getpoint"), "userm"."nickname" FROM "pointm" INNER JOIN "userm" on "pointm"."usercd" = "userm"."usercd" WHERE "pointm"."class" = '1' GROUP BY "pointm"."usercd"; =エラーメッセージ= ERROR: Attribute userm.nickname must be GROUPed or used in an aggregate function =動いた結合sql= SELECT "pointm"."usercd", "userm"."nickname" FROM "pointm" INNER JOIN "userm" on "pointm"."usercd" = "userm"."usercd" WHERE "pointm"."class" = '1'; =動いた集計sql= SELECT "pointm"."usercd", Sum("pointm"."getpoint") FROM "pointm" WHERE "pointm"."class" = '1' GROUP BY "pointm"."usercd";

  • テーブルを結合

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

  • 他テーブルの区分を使っての集計に関して

    教えて下さい。 AとBというテーブルが存在し、それぞれ Aテーブル 社員番号、金額 Bテーブル 社員番号、部署コード という項目となっています。 ※ かなり簡単なテーブルに省略してありますが、、、、 上記のBテーブルの部署コード毎にAテーブルの金額を集計したいと考えていますが、 そのようなSQLはどのように書くのでしょうか。。。 単純にfrom句で2つのテーブルを指定し、where句で社員番号で結合し、group by で部署コードを指定してもできなかったものですから。。。 初歩的な質問で申し訳ありませんが、教えて頂ければ幸いです。 よろしくお願いします。

  • PL/SQLでの集計とテーブルの結合の仕方

    いつもお世話になっております。 pl/sqlでの処理なのですが、タイトルのとおり テーブルの結合と集計で分からないところがあり、 こちらで質問させていただきました。 処理内容は あるグループでレコードを集計し、 そのグループが重複する他のテーブルと結合したいと 考えております。 【テーブル1】 (班) (回数) (秒) aaa| 10| 100 aaa| 20| 200 bbb| 10| 150 bbb| 20| 100 ccc| 10| 100 ccc| 30| 250 : : : まずこれを集計し、件数を追加して (班) (回数) (秒) (件) aaa| 30| 300| 2 bbb| 30| 250| 2 ccc| 40| 350| 2 : : : : というようにまとめ、 【テーブル2】 (年月) (班) (円) 200904| aaa| 1000 200905| bbb| 1500 200904| ccc| 2000 : : : というテーブルと結合して (年月) (班) (回数) (秒) (円×件) 200904| aaa| 30| 300| 2000 200905| bbb| 30| 250| 3000 200904| ccc| 40| 350| 4000 : : : : : という形にしたいのですが可能でしょうか? 例に挙げたのは3件しかありませんが テストデータは1万件以上ありそれを処理します。 初心者なので、テーブルの結合の仕方、 集計の仕方が分からず行き詰っております。 どなたか、お力を貸していただけないでしょうか。 よろしくお願いいたします。

  • left joinなどで結合対象のレコードから1件だけ得る方法は

    テーブル1 番号(ユニーク) その他のデータ 1  データ 2  データ 3  データ ... テーブル2 番号 名前 その他のデータ 1  名前A データ 1  名前A データ 2  名前B データ 3  名前C データ 3  名前C データ ... を、結合を使って 1  名前A テーブル1のデータ 2  名前B テーブル1のデータ 3  名前C テーブル1のデータ ...というようにしたいのですが、group by をつかわないで得る方法はありますか?(対象テーブルから1件だけ結合したい。) たとえば、複数の結合をこのようにした時、if()の中のカウントが、他の結合の影響を受けてしまいます。 select a.*,b.名前,if(count(c.番号) > 1,"複数",c.名前) from テーブル1 a left join テーブル2 b on b.番号 = a.番号 left join テーブル3 c on c.番号 = a.番号 group by a.番号,b.番号,c.番号 わかりづらい質問ですみません。