ある列をグループにして3件分だけ1行にして取得したいとする。
SQLでここまですべきか微妙だけど出来るだけSQL発行を減らすということでやってみた。


テーブルには下記のようにデータが入力されていたとします。

TypeIDNameValue
11AAA120
12AAA210
21BBB130
24BBB410
23BBB320
13AAA310
22BBB210
31CCC110

これを下記のように取得したいとする。

Type123
NameValueNameValueNameValue
1AAA120AAA210AAA310
2BBB130BBB210BBB320
3CCC110

実際の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() とか使えるからまた違うかと。

カテゴリー: SQL

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*