- ベストアンサー
複数テーブルからのカウント集計の方法
- カルテテーブルに登録されたデータを使用して、スタッフごとに対応したサービスの回数をカウントする方法を教えてください。
- また、日付の制限を指定して集計する方法も知りたいです。
- MySQL 4.0.24-standardを使用しています。
- みんなの回答 (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 '終りの日付' とすれば期間を調整することも可能です。
お礼
早いご解答ありがとうございます。 私には想像も付かない方法で勉強になります。 しかし、申し訳なのですが、従来テーブルで現状システムが稼働しており、集計の為に新たにテーブルを生成するのは、 仕様的に厳しいかと思いました。 (~~); PHP上から、なんどかクエリを発行して集計するしかないでしょうか? ご面倒をお掛け致しますが、他に良い方法がありましたら、 何卒、よろしくお願い致します。