初めて、投稿させて頂きます。
カルテテーブルに登録されたデータより、スタッフごとにどのサービスを何回対応したかを出力したいのですが、経験が浅く考え込んでいます。
また、日付の制限も指定したいです。
何卒、アドバイスをお願い致します。
MySQL 4.0.24-standardを使用しています。
カルテテーブル(chart_table)
---------------------------------------
staff | date | service1 | service2 | service3 | service4 |
12007-01-271200
32007-02-070034
22007-03-041034
スタッフテーブル(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
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 '終りの日付'
とすれば期間を調整することも可能です。
早いご解答ありがとうございます。
私には想像も付かない方法で勉強になります。
しかし、申し訳なのですが、従来テーブルで現状システムが稼働しており、集計の為に新たにテーブルを生成するのは、
仕様的に厳しいかと思いました。 (~~);
PHP上から、なんどかクエリを発行して集計するしかないでしょうか?
ご面倒をお掛け致しますが、他に良い方法がありましたら、
何卒、よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP MySql PHP 2つのテーブルをJOINで結合 user_idで抽出 1 2023/01/03 14:04
- MySQL 【MySQL】本当に困っているので、助けてください。よろしくお願いします。 3 2023/06/03 14:24
- 格安スマホ・SIMフリースマホ iPhone SE (第2世代)のeSIMでmineoとpovo2.0の両方のサービスを利用する 1 2023/01/25 22:16
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- その他(開発・運用・管理) おんどとりWebStorage APIから温度情報を取得し表示したい 2 2023/08/03 09:53
- IT・エンジニアリング 就活、ES添削。 1 2023/07/16 09:26
- 電車・路線・地下鉄 2 時間以上駅に滞在する場合は、IC 入場サービス「タッチでエキナカ」ではなくキップの方が良いの? 3 2022/12/30 12:36
- Access(アクセス) アクセスで教えてください。 例えばテーブル1に 1 佐藤 2 鈴木 3 佐々木 コードと住所一覧があ 3 2022/06/11 20:45
- 関西 京都にお住いの方に質問です 1 2023/01/08 13:06
- 就職 身元保証の代行サービス利用について 2 2023/02/10 23:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マイクラPC版のコマンドで効率...
-
エクセルで最後の文字だけ置き...
-
阪急三番街 ATM(ゆうちょ)は...
-
同一のユーザー、同一商品のと...
-
Unionした最後にGROUP BYを追加...
-
DataTableで重複行を削除したい
-
書籍の内容はまともでしょうか?
-
副問合せの書き方について
-
SQL Left Join で重複を排除す...
-
WHERE id = ? について
-
min句のSQLを改造し二番目に小...
-
MySQLのint型で001と表示する方...
-
別テーブルからSELECTした値を...
-
所有格の意味
-
select文のwhere句に配列を入れ...
-
スクリーンセイバー
-
MySQLの抽出について
-
ポスグレでの幾何学データ配列...
-
AUTO_INCREMENTのあるテーブル...
-
【MySQL】本当に困っているので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報