集計方法について教えてください

このQ&Aのポイント
  • PHPとMYSQLを使用してtable_Aとtable_Bからtable_Cの内容を取得するためのSQLを教えてください。
  • table_Cのcount項目は、cdでマッチするtable_Bのtypeの種類をカウントしたものです。
  • table_Cのpoint_total項目は、cdでマッチするtable_Bのpointを合計した数値になります。
回答を見る
  • ベストアンサー

集計方法について教えて下さい。PHP+MYSQL

こんにちは、よろしくお願い致します。 データベースに下記のようなデータが入っています。 table_A cd name --------------- 1000001 aaa 1000002 bbb 1000003 ccc 1000004 ddd 1000005 eee 1000006 fff 1000007 ggg 1000008 hhh 1000009 iii 1000010 jjj table_B cd type point --------------- 1000001 A 100 1000001 B 50 1000001 C 30 1000004 C 20 1000005 B 70 1000009 A 10 1000009 C 40 table_Aと、table_Bから、下記table_Cの内容 table_C cd name count point_total ------------------------------ 1000001 aaa 3 180 1000002 bbb 0 0 1000003 ccc 0 0 1000004 ddd 1 20 1000005 eee 1 70 1000006 fff 0 0 1000007 ggg 0 0 1000008 hhh 0 0 1000009 iii 2 50 1000010 jjj 0 0 を得るには、どのようなSQLを書けば良いのでしょうか? table_Cのcount項目は、cdでマッチするtable_Bのtypeの種類をカウントしたもので table_Cのpoint_total項目は、cdでマッチするtable_Bのpointを合計した数値になります。 分かりにくい質問ですみませんがアドバイス頂けると嬉しいです。 具体的にどのような方法で実現できるか、教えて頂けると有難いです。 よろしくお願いいたします。

  • PHP
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

手元に環境が無いので無試験ですが。 SQL文はこんな感じ ※インデントに全角スペースを用いてるのでコピペの際には注意 SELECT tblA.cd, tblA.name, IFNULL(vwB.cnt, 0) as count, IFNULL(vwB.pnt_ttl) as point_total FROM tableA as tblA LEFT JOIN (  SELECT cd, count(cd) as cnt, sum(point) as pnt_ttl  FROM tableB  GROUP BY cd ) as vwB ON tblA.cd = vwB.CD ORDER BY tblA.cd ; 結果をtableCとして保存したいなら、先頭に create table tableC as を追加 CREATE TABLE tableC as SELECT tblA.cd, tblA.name, IFNULL(vwB.cnt, 0) as count, IFNULL(vwB.pnt_ttl) as point_total FROM tableA as tblA LEFT JOIN (  SELECT cd, count(cd) as cnt, sum(point) as pnt_ttl  FROM tableB  GROUP BY cd ) as vwB ON tblA.cd = vwB.CD ORDER BY tblA.cd ;

BottleCap
質問者

お礼

とても助かりました。 本当にありがとうございます! いまいろいろと行き詰ってることがありまして 近々、また質問すると思います。 今後ともよろしくお願い致します。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

×)IFNULL(vwB.pnt_ttl) as point_total ○)IFNULL(vwB.pnt_ttl, 0) as point_total

関連するQ&A

  • C言語による「テキストファイルの読み書き(fprintf)」について

    C言語による「テキストファイルの読み書き(fprintf)」について質問です ずぶの初心者ですが、既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。 以下のように作りました。 ------------------------------------------------------------ #include <stdio.h> int main(void) { FILE *fp; fp = fopen("test.csv","r+"); fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n"); fclose(fp); return 0; } ------------------------------------------------------------ このとき「test.csv」の内容が以下のようであったとします。(容量は1MBくらいです。) 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj この状態でプログラムをコンパイルして実行すると、「test.csv」の内容が以下のようになってしまいます。(一行目が消える) AAA,BBB,CCC,DDD,EEE 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj またcsvの行が増える度に妙な挙動になっていきます・・・(一行あいたり、先頭行が5行ほど消えたり) 希望する動作としては コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj のようになるようにしたいのですがどのようにすればよいのでしょうか。 よろしくお願いします。 (使用ソフト:Borland C++ Compiler, Cpad) 参考にしたサイトの項目:http://homepage3.nifty.com/mmgames/c_guide/17-01.html

  • VBAでCSV内にある改行を取る方法

    あるシステムが吐くcsvファイルの項目の中に改行が入っているものがあります。 例) 01,aaa,bbb(改行)bbb,ccc(改行) 02,ddd,eee,fff(改行) 03,ggg(改行)ggg,hhh,iii(改行) このCSVファイルをエクセルのマクロで読み込んでシートに展開したい のですが、項目中にある改行で別レコードを認識してしまいます。 結果) A B C D ---+---+---+--- 01 aaa bbb  bbb ccc 02 ddd eee fff 03 ggg ggg hhh iii これを以下のようにしたいのですが・・・ A B C D ---+------+------+---- 01 aaa bbbbbb ccc 02 ddd eee fff 03 gggggg hhh iii どうやればよいでしょうか? ご教授お願いいたします。

  • sedで文字列の抜き出し

    ある一部分の文字列を抜き出したく、sedを使用したいと思って試行錯誤しております。 ↓あるファイル内の文字列 aaa bbb=ccc:ddd=eee:fff=ggg: aaa bbb=hhh:ddd=iii:fff=jjj: ※aaaとbbbの間はスペースです。 ※bbb,ddd,fffはある一定のキーワードです。 ※ccc,eee,ggg,hhh,iii,jjjはバラバラの文字列で長さも一定ではありません。 【質問】 上記の文字列の中でddd=の後の文字列(eee,iii)のみを抜き出したいです。 以下のようなsedを試してみましたが、 eee:fff=ggg iii:fff=jjj が抜き出されてしまいます。 sed 's/.*:ddd=\(.*\):\(.*\)$/\1/' 恐れ入りますが、皆様の知恵をお貸し下さい。

  • この場合の集計方法(エクセル)

    エクセル2003です。 下記のようなリストがあります。 |部屋|配属者| | A |aaa| | A |bbb| | A |ccc| | B |ddd| | A |eee| | C |fff| | C |ggg| | A |hhh| | B |iii| そして別の各シートに 部屋「A」ならば |配属者| |aaa| |bbb| |ccc| |eee| |hhh| というように、行に隙間を作らずに 上記のようなリストを作れる方法を 教えてください。 もちろんフィルターで絞って 部屋ごとにコピーするという不細工な方法は× 部屋の種類は約100種類 配属者データは約10,000件あります。

  • SQL 複数条件を設定

    使用言語はjavaで処理しており、 SQL Server2005にて下記のようなテーブル(T_Kekka)があります。    ID   a-1   a-2   b-1   b-2   c-1   c-2     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd    ccc   eee   fff       2   ggg   bbb   ccc     hhh   iii    jjj       3   bbb   mmm   ddd   ccc   fff    eee       4   bbb   aaa   ccc    ddd   qqq   rrr       5   zzz   sss   ttt     ccc   vvv   xxx       6   zzz   aaa   ttt     ccc   vvv   fff       7   zzz   zzz   zzz     zzz   zzz    zzz       8   qqq   rrr   ccc     ddd   fff    eee    検索する値は下記の通りです。 検索値 |a-1|a-2|b-1|b-2|c-1|c-2|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |aaa|bbb|ccc|ddd|eee|fff| 期待値としては、aはaのグループで検索、bはbのグループで検索、cはcのグループで検索をし、 一致個数の多い順に出力したいと考えております。(理想は下記のような感じです。) また、グループ内であれば逆転していてもOKです。 (例えばID:1のaグループのような感じです。) *1 一致数が同じ場合はcグループの数が多いデータが最優先となり、その他はID順になります。 期待値    ID   a-1   a-2   b-1   b-2   c-1   c-2   一致数  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd   ccc   eee   fff     6    3   bbb   mmm   ddd   ccc   fff    eee    5    8   qqq   rrr    ccc   ddd   fff    eee    4・・・*1    4   bbb   aaa   ccc   ddd   qqq   rrr     4    6   zzz   aaa   ttt    ccc   vvv    fff     3    2   ggg   bbb   ccc   hhh   iii     jjj      2    5   zzz   sss   ttt    ccc   vvv    xxx     1    7   zzz   zzz   zzz    zzz   zzz    zzz     0 知識不足のため私には複雑すぎて悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。 また、まだテスト段階なので現状のようなテーブル構造にしてしまいましたが、 他のテーブル構造の方がデータが抽出しやすかったり、レスポンスがいい場合がありましたら、 ご教授いただけると助かります。 説明が分かりづらく表が見づらくて申し訳ございませんが、 宜しくお願い致します。

  • Excel2000 データの振り分けと配列変換について

    シート1にデータを一気に入力してあります。 第1段階、所属ごとに所属1は所属1のシート、所属2は所属2のシートというようにシートに振り分けをしたい。 第2段階、振り分け後データごとに2列になるように印刷をしたい。 この様に入力されているデータを A   B   C   D 番号 名前   所属  1 AAA  1  2 BBB  2  3 CCC  1  4 DDD  3  5 EEE  4  6 FFF  5  7 GGG  6  8 HHH  3  9 III  4 10 JJJ  6  ・  ・  ・ 所属ごとにシートに振り分けて、2列 任意の単位で(この場合では、5単位ごと)になるように印刷したい。 所属1のシート 番号 名前   所属 番号 名前   所属  1 AAA  1   6 FFF  1  2 BBB  1   7 GGG  1  3 CCC  1   8 HHH  1  4 DDD  1   9 III  1  5 EEE  1  10 JJJ  1 技が無いため、切り張りしていますが、なにか良い方法がありましたら教えてください。

  • EXCEL VBA 行列操作

    どなたか教えてください。 下記の様にA1からH5までの範囲に値がある行とない行があります。 空白セルを無視しA10に行列を操作し(行列入れ替え?)、さらに上詰め でコピーしたいのです(上にある行から列順に)。 よろしくお願いします。 例です  A   B   C   D   E   F  G   H 1 2                   aaa bbb 3 ccc ddd eee fff ggg 4 5 hhh ~ 10 aaa 11 bbb 12 ccc 13 ddd 14 eee 15 fff 16 ggg 17 hhh

  • ピポッド 集計の追加

    ご存知の方、お知恵をお貸し下さい。 現在、下記のようなピポッドを組んでいます。 グループ1  AAA (AAAの合計、以下aaa+bbb+cccの合計) aaa bbb ccc        BBB (BBBの合計、以下ddd+eee+fffの合計) ddd eee fff CCC (CCCの合計、以下ggg+hhh+iiiの合計) ggg hhh iii グループ2・・・以下続く 上記に、BBBとCCCだけの合計を、(グループ1の中に)追加したいのです。 このように、合計したい項目だけを指定して 集計する事は可能でしょうか? 数式の集計アイテムの追加を行いましたが 上手くできませんでした。 ご存知の方、ご教授いただければ幸いです。 宜しくお願い致します。

  • SQLについて

    aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 111 111 111 111 111 111 111 112 112 112 112 112 112 111 112 113 113 113 113 113 111 114 114 114 114 114 114 111 114 114 114 114 114 114 112 114 115 115 114 114 115 111 114 115 115 114 114 115 112 116 116 116 116 116 116 111 116 116 116 116 116 116 112 116 116 116 116 116 117 111 116 116 116 116 116 117 112 118 118 118 118 118 118 118 上記のようなデータより、SQLのSELECTを使用して、以下のように抽出したいです。 抽出条件は以下が全て満たしているものとなります。 ・aaa,ccc,ddd,eee,gggが重複、hhhが小さいもの ・bbbが異なるもの aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 112 112 112 112 112 112 111 ・・・(1) 112 113 113 113 113 113 111 ・・・(1) 114 114 114 114 114 114 111 ・・・(2) 114 115 114 114 114 115 111 ・・・(2) (1)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象 (2)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象  また、hhhが小さいもの 以上、よろしくお願いします。

  • 大量データの一括変換

    aaa.bbb ccc.ddd eee.fff ggg.hhh 上記のようなデータが約1万行程度あるのですが、これを下記のようなユーザ名・メルアドに変換するコマンド等、お分かりになる方教えてください。ユーザ名・メルアドの間は半角スペースです。 ある程度自分で調べた結果awk等で出来そうな気がするのですが。。。 ユーザ名  メルアド   ↓     ↓ aaa.bbb aaa.bbb@hoge.com ccc.ddd ccc.ddd@hoge.com eee.fff eee.fff@hoge.com ggg.hhh ggg.hhh@hoge.com

専門家に質問してみよう