SQL 縦持ち、横持ち変換
縦持ち、横持ちテーブルの相互変換方法
こちらで簡単に、SQLの確認を行えます。(paiza.io MySQL Online)
縦 ⇒ 横
使用するテーブル
id | child_id | name |
---|---|---|
1 | 1 | "1-1" |
1 | 2 | "1-2" |
2 | 1 | "2-1" |
2 | 2 | "2-2" |
2 | 3 | "2-3" |
3 | 1 | "3-1" |
3 | 2 | "3-2" |
SQL MAX句は、GROUP BY でグループ化した場合は集約関数を使う必要があるため使用しているだけで、関数としての意味はないです。
select id, MAX(CASE WHEN child_id = 1 THEN name END) as child_id_1, MAX(CASE WHEN child_id = 2 THEN name END) as child_id_2, MAX(CASE WHEN child_id = 3 THEN name END) as child_id_3 FROM vertical GROUP BY id;
実行結果
id | child_id_1 | child_id_2 | child_id_3 |
---|---|---|---|
1 | "1-1" | "1-2" | NULL |
2 | "2-1" | "2-2" | "2-3" |
3 | "3-1" | NULL | NULL |
横 ⇒ 縦
使用するテーブル
id | child_id_1 | child_id_2 | child_id_3 |
---|---|---|---|
1 | 1-1 | 1-2 | |
2 | 2-1 | 2-2 | 2-3 |
3 | 3-1 |
SELECT * FROM ( SELECT id, 1 as child_id, child_id_1 as name FROM horizon UNION ALL SELECT id, 2 as child_id, child_id_2 as name le FROM horizon UNION ALL SELECT id, 3 as child_id, child_id_3 as name FROM horizon ) AS vertical WHERE name is NOT NULL;
実行結果
id | child_id | name |
---|---|---|
1 | 1 | 1-1 |
2 | 1 | 2-1 |
3 | 1 | 3-1 |
1 | 2 | 1-2 |
2 | 2 | 2-2 |
2 | 3 | 2-3 |