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

SQL

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