ある列をグループにして3件分だけ1行にして取得したいとする。
SQLでここまですべきか微妙だけど出来るだけSQL発行を減らすということでやってみた。
テーブルには下記のようにデータが入力されていたとします。
Type | ID | Name | Value |
---|---|---|---|
1 | 1 | AAA1 | 20 |
1 | 2 | AAA2 | 10 |
2 | 1 | BBB1 | 30 |
2 | 4 | BBB4 | 10 |
2 | 3 | BBB3 | 20 |
1 | 3 | AAA3 | 10 |
2 | 2 | BBB2 | 10 |
3 | 1 | CCC1 | 10 |
これを下記のように取得したいとする。
Type | 1 | 2 | 3 | |||
---|---|---|---|---|---|---|
Name | Value | Name | Value | Name | Value | |
1 | AAA1 | 20 | AAA2 | 10 | AAA3 | 10 |
2 | BBB1 | 30 | BBB2 | 10 | BBB3 | 20 |
3 | CCC1 | 10 |
実際のSELECT文は下記のような感じかと。
SELECT
T.Type
, MAX(CASE WHEN CNT=1 THEN T.Name END) AS Name1
, MAX(CASE WHEN CNT=1 THEN T.Value END) AS Value1
, MAX(CASE WHEN CNT=2 THEN T.Name END) AS Name2
, MAX(CASE WHEN CNT=2 THEN T.Value END) AS Value2
, MAX(CASE WHEN CNT=3 THEN T.Name END) AS Name3
, MAX(CASE WHEN CNT=3 THEN T.Value END) AS Value3
FROM (
SELECT
A.Type
, A.Name
, A.Value
, COUNT(B.ID) AS CNT
FROM Test A
INNER JOIN Test B
ON B.Type=A.Type
AND A.ID>=B.ID
GROUP BY A.Type,A.Name,A.Value
) T
GROUP BY T.Type
ORDER BY T.Type
まずサブクエリでType列でグルーピングした追い番と表示したい内容を取得する。
結果の追い番を元に一行にする。
もっとスマートなやり方があるような・・・。
SQLServer2000 を対象に作ったのでこうなったけど最新版なら row_number() とか使えるからまた違うかと。