質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

1368閲覧

MySQLでカラムの縦横を入れ替えて表示したい

Bolboldo

総合スコア11

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2017/08/06 15:07

###前提・実現したいこと
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
;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

そこから表示する形をどうすれば変えられるか。又はそもそも不可能であるかが分かりません。
出力表示の形式を日付を横にし、データのない日付も表示できないでしょうか。

⇒Tak1016さんの回答の「同じ質問」の中で回答されている通り、可能です。

以下、Tak1016さんの回答の「同じ質問」の中で回答がなかった
1つのSQLで抽出する方法(ちょっと強引)だけ記載しておきます。

⇒各行を算出するSQLをUNION ALLで繋げる方法です。
SQLはものすごく長くなるので、あまりお勧めはできませんが、仕様次第です。

SQL

1-- イメージ 2SELECT 'checkpoint' as col_name 3 ,4FROM5UNION ALL 6SELECT 'chk1_2最大' as col_name 7 ,8FROM9UNION ALL 10SELECT 'chk1_2最小' as col_name 11 ,12FROM13UNION ALL 14SELECT 'chk_1_2平均' as col_name 15 ,16FROM17UNION ALL 18SELECT 'chk_2_3最大' as col_name 19 ,20FROM21UNION ALL 22SELECT 'chk_2_3最小' as col_name 23 ,24FROM25UNION ALL 26SELECT 'chk_2_3平均' as col_name 27 ,28FROM29

投稿2017/08/07 00:58

tomari_perform

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bolboldo

2017/08/12 06:02

ご回答ありがとうございます。長さは大丈夫そうなので仕様を試行錯誤しながらやっていようと思います。
guest

0

投稿2017/08/06 18:34

Tak1016

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問