この記事は公開から2年以上経過しています。
SQL Serverで関係演算子のPIVOT
/UNPIVOT
を使い、行持ちと列持ち(縦持ちと横持ち)の相互変換を行う方法についての備忘録。
行持ち から 列持ち(PIVOT)
テーブル定義とデータ
CREATE TABLE TEST_TBL(ID INT PRIMARY KEY,
VALUE NVARCHAR(20),
NAME NVARCHAR(20),
GROUP_NO INT);
INSERT INTO TEST_TBL (ID, VALUE, NAME, GROUP_NO) VALUES
(1, 'A', 'ITEM1', 1),
(2, 'B', 'ITEM2', 1),
(3, 'C', 'ITEM3', 1),
(4, 'D', 'ITEM1', 2),
(5, 'E', 'ITEM2', 2),
(6, 'F', 'ITEM3', 2);
SQLと実行結果
SELECT
*
FROM
(
select
VALUE,
NAME,
GROUP_NO
FROM
TEST_TBL) AS T1
PIVOT(MAX(VALUE) FOR NAME IN (ITEM1, ITEM2, ITEM3)) AS T2;
PIVOT (集約関数(集約列名) FOR 集約条件列名 IN (集約条件値1, 集約条件値2, 集約条件値3, ...)
GROUP_NO
で暗黙的なGroup Byが実行されます。
この動作に関する詳細は、参考ウェブサイトにあるOracle社の説明が分かりやすいです。
列持ち から 行持ち(UNPIVOT)
テーブル定義とデータ
CREATE TABLE TEST_TBL(ID INT PRIMARY KEY,
COL1 NVARCHAR(20),
COL2 NVARCHAR(20),
COL3 NVARCHAR(20));
INSERT INTO TEST_TBL (ID,COL1,COL2,COL3) VALUES
(1,N'1-1',N'1-2',N'1-3'),
(2,N'2-1',N'2-2',N'2-3'),
(3,N'3-1',N'3-2',N'3-3');
SQLと実行結果
SELECT
COL_NAME,
COL
FROM
TEST_TBL
UNPIVOT(COL FOR COL_NAME IN (COL1, COL2, COL3)) AS T;
UNPIVOT(列値の列名 FOR 元列名を表示する列名 IN(元列名1, 元列名2, 元列名3, ...))
参考ウェブサイトなど
-
Microsoft Docs
FROM – PIVOT および UNPIVOT の使用 -
Oracle Tech Resource
3 Pivotの使い方 -
Oracle Tech Resource
7 UnPivotの使い方
以上です。