ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL 列持ち→行持ちへの変換(UNION ALL)

SQL 目次 - ray88’s diary
SQL 指南書集 目次 - ray88’s diary
外部結合で行列変換② (列→行):繰り返し項目を1列にまとめる UNION ALL - ray88’s diary
■方法1:UNION ALLで列持ちのデータを行持ちに変換する
【事例】
部署A、部署B、部署Cの月々の売り上げデータを列→行へ変換する

SELECT year, month, 'sectionA' as section, sectionA as amount FROM sales
UNION ALL
SELECT year, month, 'sectionB' as section, sectionB as amount FROM sales
UNION ALL
SELECT year, month, 'sectionC' as section, sectionC as amount FROM sales;

■方法2:LATERALという機能を使ったアンピボット

SELECT year, month, section, amount
FROM sales,
LATERAL (
    VALUES
    ('sectionA', sectionA),
    ('sectionB', sectionB),
    ('sectionC', sectionC)
) AS t(section, amount)

※出力結果

【テストデータの作成】

CREATE TABLE salses (
    year INTEGER NOT NULL,
    month INTEGER NOT NULL,
    sectionA INTEGER NOT NULL,
    sectionB INTEGER NOT NULL,
    sectionC INTEGER NOT NULL
);

INSERT INTO sales (year, month, sectionA, sectionB, sectionC) VALUES (2023, 1, 1000, 1200, 1100);
INSERT INTO sales (year, month, sectionA, sectionB, sectionC) VALUES (2023, 2, 1050, 1150, 1080);
INSERT INTO sales (year, month, sectionA, sectionB, sectionC) VALUES (2023, 3, 1020, 1180, 1070);