###前提・実現したいこと
MySQLで以下のSQLを使用した結果の縦横を入れ替えが可能かどうかを知りたいです。
別質問にて回答いただいたSQLを使用し、以下の出力結果を出せました。
そこから表示する形をどうすれば変えられるか。又はそもそも不可能であるかが分かりません。
出力表示の形式を日付を横にし、データのない日付も表示できないでしょうか。
指定したstart・endの範囲の日付をすべて表示するイメージです。
お知恵を拝借できれば嬉しいです。お手数ですがよろしくお願いします。
・テーブルイメージ
user_id chk_point laps create_datetime
1 0 1 2017/08/03 10:00
1 1 1 2017/08/03 10:05
1 2 1 2017/08/03 10:09
1 0 2 2017/08/04 11:05
1 1 2 2017/08/04 11:08
2 0 1 2017/08/03 10:15
2 1 1 2017/08/03 10:23
・現在の出力イメージ
日付 chk1_2最大 chk1_2最小 chk_1_2平均 chk_2_3最大 chk_2_3最小 chk_2_3平均
08/03 5:00 4:00 3:00 null null null
08/04 2:00 1:00 1:30 5:00 3:00 4:00
・実現したい出力イメージ
checkpoint 8/3 8/4 8/5 ・・・・8/31
chk1_2最大 5:00 2:00 null null
chk1_2最小 4:00 1:00 null null
chk_1_2平均 3:00 1:30 null null
chk_2_3最大 null 5:00 null null
chk_2_3最小 null 3:00 null null
chk_2_3平均 null 4:00 null null
###該当のソースコード
(MysQL5.6)
SELECT
create_date
,DATE_FORMAT(SEC_TO_TIME(MAX(CASE WHEN chk1 = 0 THEN diff ELSE NULL END)), '%i:%s')
,DATE_FORMAT(SEC_TO_TIME(MIN(CASE WHEN chk1 = 0 THEN diff ELSE NULL END)), '%i:%s')
,DATE_FORMAT(SEC_TO_TIME(AVG(CASE WHEN chk1 = 0 THEN diff ELSE NULL END)), '%i:%s')
,DATE_FORMAT(SEC_TO_TIME(MAX(CASE WHEN chk1 = 1 THEN diff ELSE NULL END)), '%i:%s')
,DATE_FORMAT(SEC_TO_TIME(MIN(CASE WHEN chk1 = 1 THEN diff ELSE NULL END)), '%i:%s')
,DATE_FORMAT(SEC_TO_TIME(AVG(CASE WHEN chk1 = 1 THEN diff ELSE NULL END)), '%i:%s')
FROM
(
SELECT
t1.user_id
,DATE(t1.create_datetime) AS create_date
,t1.laps
,t1.chk_point AS chk1
,t2.chk_point AS chk2
,TIMESTAMPDIFF(SECOND, t1.create_datetime, t2.create_datetime) AS diff
FROM
result_time AS t1
INNER JOIN result_time AS t2
ON t1.user_id = t2.user_id
AND t1.laps = t2.laps
AND t1.chk_point + 1 = t2.chk_point
) AS tmp
GROUP BY
create_date
;
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/12 06:02