SQL Serverで行持ちと列持ちの変換を行う方法

この記事は公開から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);

file

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, ...)

file

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');

file

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, ...))

file


参考ウェブサイトなど

以上です。

シェアする

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

フォローする