グループ抽出した複数行を1行にまとめるSQL

  • このエントリーをはてなブックマークに追加
  • このエントリーをはてなブックマークに追加

ある列をグループにして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() とか使えるからまた違うかと。

関連記事:

Pocket
Bookmark this on Delicious
Bookmark this on Google Bookmarks

カテゴリー: SQL

コメントを残す

メールアドレスが公開されることはありません。


*

This blog is kept spam free by WP-SpamFree.