• ベストアンサー

2つのテーブルでの集計2

昨日解決したかと思ったのですが、また出来ないことが出てきたので 同じようなタイトルで再度質問に参りました。 以下のようなテーブルがあるとして、 ● T1 名前|A_id|B_id| AAAA|1111|----| BBBB|----|2222| CCCC|3333|4444| ● T2 id|A_id|金額 01|1111|2000 02|3333|1000 03|1111|4000 ● T3 id|B_id|金額 01|2222|2000 02|4444|4000 ● 抽出結果でやりたいこと →SUM(A_idの金額)とSUM(B_idの金額)を足した金額が5000以上のみ抽出 かつ、T2とT3のid(通し番号)はグループ化せずに個々で出す 名前|A_id|B_id|A金額|B金額|横の合計| AAAA|1111|----|6000 |-----|6000 idはT2:01/03 CCCC|3333|4444|1000 |4000 |5000 idはT2:02/T3:02 表の作成はOKなのですが、個々のデータのidがグループ化してしまって どのデータから参照しているのかわからない状態になってしまいます 抽出結果に応じたidのデータに出力された日付を書き込みたいのですが、 今の状態ですと1つ分にしか書き込みされません… 全く同じ条件下でT2、T3個々のデータのidを全件取り出すことは可能でしょうか??アドバイス宜しくお願いします。。。 MySQL クライアントのバージョン: 5.0.45

  • MySQL
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.2

こんなんでどうでしょう? SELECT name, aid, bid, SUM(T2.price), SUM(T3.price), COALESCE(SUM(T2.price),0) + COALESCE(SUM(T3.price), 0) AS total, GROUP_CONCAT(T2.id), GROUP_CONCAT(T3.id) FROM T1 LEFT OUTER JOIN T2 USING(aid) LEFT OUTER JOIN T3 USING(bid) GROUP BY name HAVING total >= 5000; GROUP_CONCAT は方言ですが、類似の関数は他のRDBMSにも結構あります。

koke29
質問者

お礼

masa6272さん 回答ありがとうございました! 結局、仕様が変更になってしまってしまいました。 この質問をした時より簡単になったので、よしなのですが。 masa6272さんが書いて下さったコードも、落ち着いた頃に試してみて 今後に役立ててみようと思います。 知らない関数が出てきたので、そのあたりも勉強しつつ。 専門家とのことなので、きっとバッチリ動くんでしょうねー♪ 私ももっと勉強して、どんな処理でも作れるようになりたいです。 ありがとうございました。 またいつか私の質問を見かけたら、是非回答 宜しくお願いします!

その他の回答 (1)

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

>データのidを全件取り出すことは可能でしょうか?? T2およびT3にそれぞれ結果を導いたSQLをサブクエリでinner joinしてやれば よいのでは? なんか構造的に破綻しそうな気がしますが、できないことはないでしょう

koke29
質問者

お礼

yambejpさん、回答ありがとうございます! 構造的に破綻…に笑ってしまいました。この方法は力技なんですね笑 ひとまず今回は仕様変更となり、より簡単な処理で足りることになったので idのみ取り出すSQL文で対応することにしました 前回に引き続きアドバイス頂き、助かりました。 またいつか私の質問を見かけたときは、是非アドバイスお願いします! ありがとうございましたー。

関連するQ&A

  • 2つのテーブルでの集計

    こんにちは。 1日悩んでまだ解決出来ないのでちょっと質問に参りました。 以下のような感じのテーブルがあるとして ● T1 名前|A_id|B_id| AAAA|1111|----| BBBB|----|2222| CCCC|3333|4444| ● T2 A_id|金額 1111|2000 3333|1000 1111|4000 ● T3 B_id|金額 2222|2000 4444|4000 ● 抽出結果でやりたいこと →SUM(A_idの金額)とSUM(B_idの金額)を足した金額が5000以上のみ抽出 名前|A_id|B_id|A金額|B金額|横の合計| AAAA|1111|----|6000 |-----|6000 CCCC|3333|4444|1000 |4000 |5000 テーブル同士はLEFT JOINで繋がっており A_id B_idの合計はそれぞれ SUM()を使って、とりあえず出ている状態です あとはA_id と B_idの合計を出して、5000以上のみ抽出で終わりですが 1.SUM(A_id) とSUM(B_id)の合計方法 2.5000以上の判別方法 をどうするか で試行錯誤しているところです。 PHPで無理矢理 判別させれば表は出せると思うのですが、SQL文(というのでしょうか)の中でどうにかしたいと思っています。 SUMの使い方やHAVING WHERE の使い方・使いどころなどが微妙にわからず うまく応用出来ないので、こういう使い方があるよ・出来るよ といった 参考例があれば教えて頂けますでしょうか。ヨロシクお願いします。 MySQL クライアントのバージョン: 5.0.45

    • ベストアンサー
    • MySQL
  • SQL データ集計

    はじめまして、現在Postgres8.3を利用して開発を行っています。 以下のテーブルがあります。 No  グループ ------------------------------------- 1    AAAA 2    BBBB 3    CCCC ■テーブルB ID  項目CD 評価結果 グループ 登録日 ------------------------------------- A   1-1-1   ○ AAAA 2000-10-10 A   1-1-1   ○ AAAA 2007-12-10 B   1-1-1   × AAAA 2006-12-16 C   1-1-1   ○ AAAA 2009-04-16 A   1-2-1   ○ AAAA 2004-10-16 A   1-2-1   ○ AAAA 2007-01-16 B   1-2-1   ○ AAAA 2003-12-14 C   1-2-1   〇 AAAA 2007-12-15 評価結果は、○と×があり、項目CDごとに集計を行い、項目CDが同じ場合は、○がいつくあっても1とみなして計算するということをおこないたいです。 登録日を指定して、抽出したいのですが、 登録日を 条件に含めると、全部計算されてしまいます。 select count(評価結果) from (select ID,項目CD,評価結果 from テーブルB group by ID,項目CD,評価結果 order by ID,項目CD,評価結果) as rtable where rtable.評価結果 = '○' rtable.登録日  between '2000-01-01' and '2009-01-01' ■理想の結果 グループ 合計  -------------- AAAA   5    ■現在の結果 グループ 合計  -------------- AAAA   7    どうしても出来なくって、困っています。 よろしくお願いいたします!!

  • ACCESSにて2つのテーブルの比較

    2つのテーブルA,テーブルBがあります。テーブルBのデータ以外のデータを選ぶにはどうのようにすれば良いのでしょうか? テーブルA data--- aaaa bbbb cccc dddd aaaa cccc テーブルB data--- aaaa bbbb 欲しい結果 テーブルA data--- cccc dddd cccc よろしくお願い致します。

  • 複数テーブルの結合

    テーブルA  a_id id a_data a_date ----------- テーブルB id b_data b_date テーブルC id c_data c_date ----------- テーブルAとテーブルBは「id」がキーで1:N(Nは0も含む) テーブルAとテーブルCは「id」がキーで1:N(Nは0も含む) このような3のテーブルで a_idを検索キーにして次のフィールドのデータを抽出したいのですが。。。 ※テーブルCのc_dateを降順で先頭の1レコードのみ ※テーブルBのidをカウントする selectの結果(イメージ) id a_data a_date count(B.id) c_date ------------------------------------- 001 AAAA 2007/02/01 20 2007/02/14 005 BBBB 2007/02/02 0 2007/02/10 006 CCCC 2007/02/02 0 2007/01/08 003 DDDD 2007/02/01 100 002 EEEE 2007/02/01 9 004 FFFF 2007/02/01 0 よろしくお願いします

  • SQLでの集計について

    こんにちわ。以下のようなテーブルから条件に見合う合計を出したいと思いSQLを書いてみたのですが、 思った結果になりません。 テーブルA ID1 得意先Cd 営業所Cd 日付 1  001    001  2005/09/01 2  001    002  2005/09/01 3  001    001  2005/09/03 テーブルB ID2 ID1 部署 数量 金額 1  1  01  1  1000 2  1  01  1  1000 3  1  02  1  1000 4  2  01  1  1000 5  2  01  1  1000 6  3  01  1  1000 7  3  01  1  1000 8  3  02  1  1000 [抽出結果] 得意先Cd 営業所Cd 日付  部署 数量(Sum) 金額(Sum) 001    001  2005/09/01 01   2   2000 001    001  2005/09/01 02   1   1000 001    001  2005/09/03 01   2   2000 001    001  2005/09/03 02   1   1000 001    002  2005/09/01 01   2   2000 [SQL] select 得意先Cd,営業所Cd,日付,部署,SUM(数量) As '数量計',SUM(金額) As '金額計' from テーブルA AA Inner join テーブルB BB ON (AA.ID1 = BB.ID1) group by 得意先Cd,営業所Cd,日付,部署,数量,金額 order by 得意先Cd,営業所Cd,日付,部署 このSQLを実行すると、日付、部署共に同じ場合でも数量・金額が合計値となりません。 得意先Cd 営業所Cd 日付  部署 数量 金額 001    001  2005/09/01 01 1  1000 001    001  2005/09/01 01 1  1000 どのように変更を加えれば、上記の「抽出結果」にできるのでしょうか? よろしくお願いいたします。

  • 2つのテーブルの集計

    MySQLでSQLを書いている初心者です。 ある会社には卸売部門と小売部門があり、同一の商品を扱っています。 それぞれの売上明細は tbl_sales と tbl_retailsales で別になっています。 商品別の2つの部門の売上数量を1行で表現したいと考えています。 下のような感じです。 商品ID 商品名 卸売 小売 ========================= 00001  aaaa  100  10   00002  bbbb  200  13   00003  cccc  300  15   2つのSQLをUNIONでつなげてみましたが同一行に「卸売」「小売」が並んでくれません。 SELECT goodsId, goodsName, sum(quantity) FROM tbl_sales WHERE salesDate BETWEEN '2014-06-01' AND '2014-06-30' GROUP BY goodsId UNION SELECT goodsId, goodsName, sum(quantity) FROM tbl_retailsales WHERE retailSalesDate BETWEEN '2014-06-01' AND '2014-06-30' GROUP BY goodsId どのようにSQLを組み立てたらいいでしょうか。 教えて下さい。 よろしくお願いいたします。

  • SUMとJOINのことで質問です

    こんにちは 以下のようなテーブルがあるとして これらをLEFT JOINで全て繋いで、T2以降のSUM(金額)をそれぞれ 取りたいのですが、T2 T3 T4 T5 T6 の中にデータを入れるごとに 2倍・4倍・8倍・16倍とSUMの中の値がドンドン増えていってしまう のですが、何が原因なのでしょうか? 増えていく値が2のn乗なのはわかるのですが、どこが引っかかって こんなことになるのかサッパリわかりません。 ● T1 名前|A_id|B_id|C_id|D_id|E_id| AAAA|1111|2222|3333|4444|5555| ● T2 id|S_id|金額 01|1111|1000 →SUM=1000のはずが、16000 ● T3 id|S_id|金額 01|2222|2000 →SUM=2000のはずが、32000 ● T4 id|S_id|金額 01|3333|3000 →SUM=3000のはずが、48000 ● T5 id|S_id|金額 01|4444|4000 →SUM=4000のはずが、64000 ● T6 id|S_id|金額 01|5555|5000 →SUM=5000のはずが、80000 原因と宜しければ修正方法も教えて頂けるとありがたいです。 MySQL クライアントのバージョン: 5.0.45です 宜しくお願いします。。。

  • 連結したフィールドでグループ化し、他のフィールドの最大値のレコード全体を抽出

    図面管理のデータベースをつくっています。 連結したフィールドでグループ化し、他のフィールドの最大値のレコード全体を抽出したいのですが どのようにしたらいいのでしょうか? いろいろ調べたのですがなかなかよい結果が出ません。 お知恵をおかしください。よろしくお願いします。 mysqlバージョン:5.0.45 例 テーブル:a(図面管理) a_id(id) a1(図番) a2(種類用紙サイズ) a3(枝番) a4(図面名) a_id a1 a2 a3 a4 1   1 3P 0 aaaa 2   2 3P 0 bbbb 3   2 3P 1 bbbb 4   1 4P 0 cccc 5   1 4P 1 cccc 6   1 4P 1 cccc このテーブルのa1とa2を連結します。(連結フィールド:ren) a_id a1 a2 a3 a4  ren 1   1 3P 0 aaaa 13P 2   2 3P 0 bbbb 23P 3   2 3P 1 bbbb 23P 4   1 4P 0 cccc 14P 5   1 4P 1 cccc 14P 6   1 4P 2 cccc 14P 連結したもの(ren)をグループ化しますこのとき、枝番の値が高いレコードだけ抽出します。 a_id a1 a2 a3 a4  ren 1   1 3P 0 aaaa 13P 3   2 3P 1 bbbb 23P 6   1 4P 2 cccc 14P この最終的な結果を出す方法をお教えください。 おねがいします。

    • ベストアンサー
    • MySQL
  • SQLでの集計

    下記の様に、「複数のitemを買っているuserと購入されたitem」のテーブルと、 user item ---------------------------------- 田中 AAAA 田中 CCCC 田中 EEEE 北野 DDDD 北野 BBBB 北野 AAAA 小堺 CCCC 小堺 EEEE 松本 EEEE 松本 KKKK 松本 CCCC 松本 DDDD 浜田 BBBB 浜田 DDDD 下記の様な IDに紐付いた 「item」のテーブルから、 ID  item ---------------------------------- 1   AAAA 2   BBBB 3   CCCC 4   DDDD 5   EEEE 下記の様に各itemと各itemを買った場合に一緒に買われるitemの一覧を結果 として表示させたいのですが、クエリの作り方が思い浮かばず、困っています。 ※)可能であれば、買われたitemを表示する際にはbuy1から(左側から)同時購入 回数の多いitemを重複せずに並べて表示したい ID  item  buy1  buy3  buy4  buy5  buy6・・・・ ---------------------------------- 1  AAAA CCCC BBBB DDDD EEEE 2  BBBB DDDD AAAA 3  CCCC AAAA EEEE DDDD KKKKK 4  DDDD AAAA BBBB CCCC EEEE 5  EEEE AAAA CCCC KKKKK 尚、IDと紐付いているitem数は決まっていますが、買われるitemの種類は上記 の様にIDが1~5だけではなく、集計してみないと判らない状況です。 今の所、SQLはACCESS(2003)上にて手打ちしています。 以上、ご教示のほど、宜しくお願い致します。

  • 重複しているデータを取得したい

    [TBL_TEMP] ID 年月1  年月2 項目A  項目B -------------------------------------------- 1 200909 200910 aaaa bbbb 2 200807 200809 aaaa bbbb 3 200909 200910 aaaa bbbb 4 200909 200909 aaaa bbbb 5 200807 200809 aaaa bbbb 上記のようなデータがあり、年月1と年月2でグルーピングして、重複しているデータを抽出する場合は、以下のSQLでデータを取得できます。 SELECT MIN(ID),年月1,年月2 FROM TBL_TEMP GROUP BY 年月1,年月2 HAVING COUNT(1) >= 2 上記のSQLの場合、重複データの中でIDが一番小さいもののみが取得されるため、ID=1、2の2データが取得できます。 これを重複データ全件、つまり、ID=1,2,3,5のデータを取得するには、SQLをどのように書けばよいのかがわかりません。 どなたかアドバイスを頂けないでしょうか? よろしくお願いいたします。