ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

ヨコをタテにするSQL

パフォーマンス考慮だかなんだか知らないが、非正規化の末路だか、行を列にしたうえ、さらに列をまとめてしまったらしい。

k dt
1 "a"
1 "b"
1 "c"

非正規化すると、

k dt1 dt2 dt3
1 "a" "b" "c"

さらにすすめて、

k dt
1 "abc"

となった状態。
で、これをバラすSQLってのが、ヨコをタテにするSQLってわけで、
こんな感じ。

select
	k
	, substring(dt, seq, 1)
from
	(
		select 1 seq union all
		select 2 seq union all
		select 3 seq
	) seq_tbl
	, (
		select k, dt from tbl
	) yoko_tbl
order by
	k
;

mysqlでの結果はこう。

+------+-----------------------+
| k    | substring(dt, seq, 1) |
+------+-----------------------+
|    1 | a                     |
|    1 | b                     |
|    1 | c                     |
|    2 | d                     |
|    2 | e                     |
|    2 | f                     |
+------+-----------------------+

ちなみに元データ

mysql> select * from tbl;
+------+------+
| k    | dt   |
+------+------+
|    1 | abc  |
|    2 | def  |
+------+------+

設計もキモいけど、SQLもキモいよなあ。