複数列のデータを縦に並べる
この横に並んでいるデータを
| CD | RANK1 | PRICE1 | RANK2 | PRICE2 | RANK2 | PRICE3 |
|---|---|---|---|---|---|---|
| 1 | A | 100 | B | 200 | C | 300 |
| 2 | A | 120 | B | 220 | C | 320 |
| 3 | A | 130 | B | 230 | C | 330 |
このように縦に並べます。
| CD | RANK | PRICE |
|---|---|---|
| 1 | A | 100 |
| 1 | B | 200 |
| 1 | C | 300 |
| 2 | A | 120 |
| 2 | B | 220 |
| 2 | C | 320 |
| 3 | A | 130 |
| 3 | B | 230 |
| 3 | C | 330 |
列が1つであれば UNPIVOT を使用することでできますが、
複数あると、 UNPIVOT を使いながら、 JOIN したり面倒です。
CROSS APPLY を使用することで少ないコードで実行できます。
SELECT CD
,v.NO
,v.RANK
,v.PRICE
FROM TABLENAME
CROSS APPLY
(values ('01' ,RANK1 ,PRICE1),
('02' ,RANK2 ,PRICE2),
('03' ,RANK3 ,PRICE3),
) v(NO
,RANK
,PRICE)
上記では行NOを付けているので、実行結果として以下のようになります。
| CD | NO | RANK | PRICE |
|---|---|---|---|
| 1 | 01 | A | 100 |
| 1 | 02 | B | 200 |
| 1 | 03 | C | 300 |
| 2 | 01 | A | 120 |
| 2 | 02 | B | 220 |
| 2 | 03 | C | 320 |
| 3 | 01 | A | 130 |
| 3 | 02 | B | 230 |
| 3 | 03 | C | 330 |