SQLで検索結果を縦横変換する
SQLで取得した各行を一定のくくりで横に表示させたいときがあります。
そんなときはSQLで縦横変換を行います。
まずは準備
まずはテーブルやデータを準備します。
今回は各自の各教科ごとの得点を管理するテーブルを作成します。
--テーブルを準備する CREATE TABLE #test_tbl ( 番号 INT ,名前 VARCHAR(20) ,教科 VARCHAR(20) ,得点 INT ) --データを準備する INSERT INTO #test_tbl VALUES( 1, '太郎くん', '数学', 80 ) INSERT INTO #test_tbl VALUES( 1, '太郎くん', '英語', 70 ) INSERT INTO #test_tbl VALUES( 1, '太郎くん', '国語', 60 ) INSERT INTO #test_tbl VALUES( 2, '次郎くん', '数学', 30 ) INSERT INTO #test_tbl VALUES( 2, '次郎くん', '英語', 40 ) INSERT INTO #test_tbl VALUES( 2, '次郎くん', '国語', 50 ) INSERT INTO #test_tbl VALUES( 3, '花子さん', '数学', 100 ) INSERT INTO #test_tbl VALUES( 3, '花子さん', '英語', 90 ) INSERT INTO #test_tbl VALUES( 3, '花子さん', '国語', 80 )
普通に検索
作成したデータ普通に検索するとこんな漢字でしょうか。
--普通に検索すると SELECT * FROM #test_tbl ORDER BY 番号,教科
1 太郎くん 英語 70 1 太郎くん 国語 60 1 太郎くん 数学 80 2 次郎くん 英語 40 2 次郎くん 国語 50 2 次郎くん 数学 30 3 花子さん 英語 90 3 花子さん 国語 80 3 花子さん 数学 100
人ごとに縦横変換して1行する
上記で用意したデータを人ごと、教科ごとに1行にして縦横変換してみます。
--検索結果を縦横変換する SELECT 番号 ,名前 ,MAX(CASE WHEN 教科='英語' THEN 得点 ELSE 0 END) AS 英語得点 ,MAX(CASE WHEN 教科='数学' THEN 得点 ELSE 0 END) AS 数学得点 ,MAX(CASE WHEN 教科='国語' THEN 得点 ELSE 0 END) AS 国語得点 FROM #test_tbl GROUP BY 番号 ,名前 ORDER BY 番号 DROP TABLE #test_tbl
結果は
1 太郎くん 70 80 60 2 次郎くん 40 30 50 3 花子さん 90 100 80
これで人ごとに教科ごとの得点を1行で取得することができます。
縦横変換の完成です。