複数テーブルからのカウント集計の方法

このQ&Aのポイント
  • カルテテーブルに登録されたデータを使用して、スタッフごとに対応したサービスの回数をカウントする方法を教えてください。
  • また、日付の制限を指定して集計する方法も知りたいです。
  • MySQL 4.0.24-standardを使用しています。
回答を見る
  • ベストアンサー

複数テーブルからのカウント集計

初めて、投稿させて頂きます。 カルテテーブルに登録されたデータより、スタッフごとにどのサービスを何回対応したかを出力したいのですが、経験が浅く考え込んでいます。 また、日付の制限も指定したいです。 何卒、アドバイスをお願い致します。 MySQL 4.0.24-standardを使用しています。 カルテテーブル(chart_table) --------------------------------------- staff | date | service1 | service2 | service3 | service4 | 1 2007-01-27 1 2 0 0 3 2007-02-07 0 0 3 4 2 2007-03-04 1 0 3 4 スタッフテーブル(staff_table) --------------------------------------- no | id | 1 佐藤 2 鈴木 3 田中 サービステーブル(service_table) --------------------------------------- no | name | 1 サービスA 2 サービスB 3 サービスC 4 サービスD 結果(2007-01 ~ 2007-03) ---------------------------------------       佐藤 | 鈴木 | 田中 | サービスA 1 1 0 サービスB 1 0 0 サービスC 0 1 1 サービスD 0 1 1

  • kebyi
  • お礼率55% (5/9)
  • MySQL
  • 回答数1
  • ありがとう数1

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

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

ちょっと難しいかもしれませんがピポットテーブルという考え方を 使うと解決します。 まず、chart_tableは今のままでは使い勝手が悪いのでこんな風にします。 staff | date |service 1 2007-01-27 1 1 2007-01-27 2 2 2007-03-04 1 2 2007-03-04 3 2 2007-03-04 4 3 2007-02-07 3 3 2007-02-07 4 ピボットテーブルというのは縦を横に入れ替える仕組みです。 こんな感じで左上から右下に1が入るテーブルを用意します。 id | 佐藤 | 鈴木 | 田中 1 1 0 0 2 0 1 0 3 0 0 1 以上を踏まえてざっと書きますので、可能ならそのまま実行してみてください。 データの作成 CREATE TABLE `chart_table`( `staff` INT NOT NULL ,`date` DATE NOT NULL ,`service` INT NOT NULL ,UNIQUE(`staff`,`date`,`service`) ); INSERT INTO `chart_table` VALUES ('1','2007-01-27','1') ,('1','2007-01-27','2') ,('3','2007-02-07','3') ,('3','2007-02-07','4') ,('2','2007-03-04','1') ,('2','2007-03-04','3') ,('2','2007-03-04','4'); CREATE TABLE `staff_table`( `no` INT NOT NULL ,`id` VARCHAR(30) ,PRIMARY KEY(`no`) ); INSERT INTO `staff_table` VALUES ('1','佐藤') ,('2','鈴木') ,('3','田中'); CREATE TABLE `service_table`( `no` INT NOT NULL ,`name` VARCHAR(30) ,PRIMARY KEY(`no`) ); INSERT INTO `service_table` VALUES ('1','サービスA') ,('2','サービスB') ,('3','サービスC') ,('4','サービスD'); CREATE TABLE `PIVOT`( `id` INT NOT NULL ,`佐藤` INT ,`鈴木` INT ,`田中` INT ,PRIMARY KEY(`id`) ); INSERT INTO `PIVOT` VALUES (1,1,0,0) ,(2,0,1,0) ,(3,0,0,1); 集計用SQL SELECT SE.`name` ,SUM(`佐藤`) AS `佐藤` ,SUM(`鈴木`) AS `鈴木` ,SUM(`田中`) AS `田中` FROM `service_table` AS SE LEFT JOIN `chart_table` AS CH ON SE.`no`=CH.`service` INNER JOIN `PIVOT` AS PI ON CH.`staff`=PI.`id` WHERE 1 AND CH.`date` BETWEEN '2007-01-01' AND '2007-03-31' GROUP BY SE.`no`; ここで、CH.`date` BETWEEN '始まりの日付' AND '終りの日付' とすれば期間を調整することも可能です。

kebyi
質問者

お礼

早いご解答ありがとうございます。 私には想像も付かない方法で勉強になります。 しかし、申し訳なのですが、従来テーブルで現状システムが稼働しており、集計の為に新たにテーブルを生成するのは、 仕様的に厳しいかと思いました。 (~~); PHP上から、なんどかクエリを発行して集計するしかないでしょうか? ご面倒をお掛け致しますが、他に良い方法がありましたら、 何卒、よろしくお願い致します。

関連するQ&A

  • テーブルの結合・・・

    教室テーブル id, class 1, A組 2, B組 3, C組 生徒テーブル id, name 1, 佐藤 1, 山田 2, 鈴木 3, 田中 3, 後藤 3, 加藤 という二つのテーブルがあります。 これらをLEFT JOINで結合したのですが。 A組, 佐藤 A組, 山田 B組, 鈴木 C組, 田中 C組, 後藤 C組, 加藤 となってしまいます。 これを同じ教室名でまとめて、 A組, 佐藤 山田 B組, 鈴木 C組, 田中 後藤 加藤 というように表示したいのです。 できればクエリだけで解決したいのですが・・・ よろしくお願いします。

    • ベストアンサー
    • MySQL
  • テーブル結合方法について

    MySQL5.1で、Table a ,Table b から、Table cのように取り出したいのですが、 SQLでSELECTする方法がわかりません。 Table b優先だけど、Table aにしかデータがない場合もあるといった感じです。 Table a No  Name 1 加藤 2 佐藤 3 田中 Table b No Name 2 佐藤先輩 4 田辺先輩 Table c No Name 1 加藤 2 佐藤先輩 3 田中 4 田辺先輩 どうか、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • PHPで同じDBから違う内容でカウントを繰り返す

    各クラスに、田中・鈴木・佐藤が何人いるかMySQLのデータベースからカウントし HTMLでテーブルを組んで、それぞれの人数を表示しています。 【カウント用PHP】 $cnt_A = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%田中%' AND class LIKE '%1組%'"; $cnt_recordSet_A = mysql_query($cnt_A); $table_A = mysql_fetch_assoc($cnt_recordSet_A); $A = number_format($table_A['cnt_A']); $cnt_B = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%鈴木%' AND class LIKE '%1組%'"; $cnt_recordSet_B = mysql_query($cnt_B); $table_B = mysql_fetch_Bssoc($cnt_recordSet_B); $B = number_format($table_B['cnt_B']); $cnt_C = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%佐藤%' AND class LIKE '%1組%'"; $cnt_recordSet_C = mysql_query($cnt_C); $table_C = mysql_fetch_Cssoc($cnt_recordSet_C); $C = number_format($table_C['cnt_C']); $cnt_D = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%田中%' AND class LIKE '%2組%'"; $cnt_recordSet_D = mysql_query($cnt_D); $table_D = mysql_fetch_Dssoc($cnt_recordSet_D); $D = number_format($table_D['cnt_D']); $cnt_E = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%鈴木%' AND class LIKE '%2組%'"; $cnt_recordSet_E = mysql_query($cnt_E); $table_E = mysql_fetch_Essoc($cnt_recordSet_E); $E = number_format($table_E['cnt_E']); $cnt_F = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%佐藤%' AND class LIKE '%2組%'"; $cnt_recordSet_F = mysql_query($cnt_F); $table_F = mysql_fetch_Fssoc($cnt_recordSet_F); $F = number_format($table_F['cnt_F']); 【表示用PHP】 +------+-----------------+-------------------+ |----|1組          |2組           | +------+-----------------+-------------------+ |田中|<?PHP print $A ?>人|<?PHP print $D ?>人| +------+-----------------+-------------------+ |鈴木|<?PHP print $B ?>人|<?PHP print $E ?>人| +------+-----------------+-------------------+ |佐藤|<?PHP print $C ?>人|<?PHP print $F ?>人| +------+-----------------+-------------------+         (テーブルはHTMLで作成、コードは略します・・・) 今後、各テーブルにさらに  ・男子の人数/女子の人数 表示例: +------+---------------------------------------------------------------------+...... |田中|<?PHP print $A ?>人(男子:<?PHP print $A_boy ?>/女子:<?PHP print $A_girl ?>)|...... +------+---------------------------------------------------------------------+...... というように増やしていこう思ったのですが、 【カウント用PHP】がすごく長くなってしまって、スマートじゃないのではないかと疑問に思っています。 簡潔なやり方などご存じの方いましたらご教授お願い致します。

    • ベストアンサー
    • PHP
  • ピボットテーブルの集計結果を使って、さらに条件を付けて集計をしたいです

    ピボットテーブルの集計結果を使って、さらに条件を付けて集計をしたいです。 たとえば、このようなピボットテーブルから、 [A]      [B]       [C]       [D]                         1月 Group  Account1   Account2 G0    田中         東京     5         加藤         大阪     2 G1     佐藤        大阪      3 G1    田中         名古屋       A列のGroupをキーにして、D列を集計します。 G0の合計は7で個数は2、G1の合計は3で個数は1、という結果を出すにはどのようにしたら良いでしょうか?

  • 複数テーブルのリレーションについて

    こんにちは。 oracleの複数テーブルのリレーションについてご教示頂け ないでしょうか? 実現したいことは下記の通りです。 ■oracleのバージョン oracle 8i 言語 VS2005 VB.net ■実現したいこと  下記の(1)の抽出条件で絞り込んだ(2)の情報を表示 (1)抽出条件  (1)【Table A】の【更新日時】が指定の日時と合致する  (2)【Table A】の【入力者ID】にひもずく     【Table C】の【区分名称】が 指定されたものと合致する (2)表示したいカラム  (1)【Table A】の【入力者ID】に該当する【Table B】の【名前】  (2)【Table A】の【修正者ID】に該当する【Table B】の【名前】 ■■■■■■具体例です■■■■■■■■■■■■■■■■■■■ 各テーブルに以下のようなデータが入力されている場合 画面から下記(1)・(2)の抽出条件がが選択された場合 下記の内容を表示したいと考えています。 ■抽出条件 (1)日時=20009/06/12 (2)区分名称=テスト ■表示結果 入力者 :001-山田 修正者 :002-田中 更新日時:20009/06/12 【Table A】 | 入力者ID | 修正者ID | 更新日時 | ------------------------------------- | 001 | 002 | 20009/06/12 | | 003 | 002 | 20009/06/12 | 【Table B】 | ID | 名前 | 区分NO | ----------------------------- | 001 | 山田 | 1 | | 002 | 田中 | 2 | | 003 | 鈴木 | 2 | 【Table C】 | 区分NO | 区分名称 | ---------------------- | 1 | テスト | | 2 | 本番 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 現状以下の方向で進めようとしてるのですが、 これだと「区分名称=テスト」という抽出条件が 追加できずに困っています。 select * from 【Table A】 INNER JOIN 【Table B】 B_1 ON (【Table A】.入力者ID = B_1.ID) INNER JOIN 【Table B】 B_2 ON (【Table A】.修正者ID = B_2.ID) Where 【Table A】.更新日時 = '20009/06/12' 以上、宜しくお願い申し上げます。

  • アクセスの違うファイルデータをひとつのテーブルにしたい

    アクセス初心者です。 今回仕事でデータを分析することになったのですが、わからないので教えて頂きたいです。 あるデータをアクセス移行し、Aファイル Bファイルのアクセスファイルを作りました。 Aファイルのテーブル 商品NO  枝NO   出荷年月  店  商品 123    01    2007.08   東京  A 345    01    2007.08   大阪  A 567    02    2007.08   東京  B Bファイルのテーブル 商品NO+枝NO   店   担当者 12301       東京   山田 34501       大阪   鈴木 56702       東京   佐藤 C(作りたいテーブル) 商品NO  枝NO   出荷年月  店  商品  担当者 123     01   2007.08  東京  A   山田 345     01   2007.08  大阪  A   鈴木 567     02   2007.08  東京  B   佐藤 *Bの担当者項目をAに加えたい もしくは D(作りたいテーブル) 商品NO+枝NO   店   担当者 出荷年月   商品 12301       東京   山田  2007.08    A 34501       大阪   鈴木  2007.08    A 56702       東京   佐藤  2007.08    B *Aの出荷年月 商品をBに加えたい 私は AファイルにBファイルをリンクさせました。 その後、AとBのテーブルをリレーションシップしようと思いましたが、 KEYにしようと思った商品NOが Aでは 商品NO と 枝NOでわかれていたためわからなくなってしまいました。 CもしくはDを作る方法はあるのでしょうか? 他の社員がまったくアクセスを利用していない人なので、困っています。 長くなってすいません。

  • どなたか取り出し方を教えてください

    はじめまして、どなたか教えてください。たとえば Xというテーブルがあって。AとB2つのフィールドがあります A列 B列 鈴木 100 鈴木 125 鈴木 156 佐藤 354 佐藤 552 佐藤 132 田中 151 田中 99 田中 845 というテーブルから a列の中のものはdistinct 的な取り出し方をしつつ B列で最も大きな数字のa行を取り出したいのです 取り出したい結果 A列 B列 鈴木 156 佐藤 552 田中 845 とするにはどうすればよいのかさっぱりわかりません どなたか教えてくださいませ

  • エクセルでの集計関数No.2

    前回の質問より複雑なデータの集計が飛び込んで困っています。 例    A   B   C   D   E   F   G   H   I   J 1  鈴木 田中 佐藤 八木 石島 須藤 徳間 遠藤 伊藤 斉藤 2  田中 八木 田中 遠藤 鈴木 伊藤 佐藤 佐藤 鈴木 徳間 3  石島 鈴木 徳間 鈴木 伊藤 .... といったデータが存在しています(A1:J3)の範囲内で最頻値の文字列を検出する関数の組み合わせを教えてください。回答例 鈴木  しかも、鈴木 佐藤が同一の場合メッセージを表示させるには..とほほです。よろしくお願いします。                                               

  • ACCESSで重複するデータをまとめたいのですが

    ACCESS超初心者です。 ヘルプを見たのですが解決できなかったので、ご質問させてください。    フィールド        フィールド1 フィールド2 田中  A        田中 A       B 田中  B    →   鈴木 A 鈴木  A        佐藤 C 佐藤   C ACCESSで上記のようにデータをまとめたいのですが どのようなテーブル、クエリを組めばよいでしょうか? ご教示願います

  • Accessでテーブルの内容を抽出したい

    お世話になります。 Access2000で作成しております。 下記のテーブルAがあります。 名前1とタイム1,名前2とタイム2をセットにして、 テーブルBを作成したいのですが、 どのようにすれば作成できるでしょうか? 可能でしたら、「クエリ」で、説明難しければ「SQL」で 教えていただければと思います。 ※SQLの場合は、クエリに変換して使用します。 ----テーブルA---- 番号 名前1 名前2 名前3 タイム1 タイム2 タイム3 1 山田 田中  佐藤 10 8 9 2 鈴木 木村  戸田 7  8 9 ----テーブルB------ 名前 タイム 山田 10 田中  8 佐藤 9 鈴木 7 ・ ・ -------------------- お手数ですがよろしくお願いいたします。