Oracleの縦方向データを横方向に変換する方法は何ですか?

Oracleデータベース内の縦データを横データに変換するには、OracleのPIVOT演算子を使用できます。

ピボット演算子を使用して縦データを横データに変換する方法を示す例です。

仮に以下のテーブル構造がある場合:

CREATE TABLE sales (
    product_id INT,
    category VARCHAR2(50),
    sales_date DATE,
    sales_amount NUMBER
);

表には以下のデータが記載されています:

INSERT INTO sales VALUES (1, 'Category A', '2021-01-01', 100);
INSERT INTO sales VALUES (2, 'Category B', '2021-01-01', 200);
INSERT INTO sales VALUES (1, 'Category A', '2021-02-01', 150);
INSERT INTO sales VALUES (2, 'Category B', '2021-02-01', 250);
INSERT INTO sales VALUES (1, 'Category A', '2021-03-01', 120);
INSERT INTO sales VALUES (2, 'Category B', '2021-03-01', 180);

上記のデータを横方向に変換するには、以下のクエリ文を使用します。

SELECT *
FROM (
    SELECT product_id, sales_date, sales_amount
    FROM sales
)
PIVOT (
    SUM(sales_amount)
    FOR sales_date IN (
        TO_DATE('2021-01-01', 'YYYY-MM-DD') AS "2021-01-01",
        TO_DATE('2021-02-01', 'YYYY-MM-DD') AS "2021-02-01",
        TO_DATE('2021-03-01', 'YYYY-MM-DD') AS "2021-03-01"
    )
)
ORDER BY product_id;

結果は次のようになります:

PRODUCT_ID  2021-01-01  2021-02-01  2021-03-01
-----------------------------------------------
1           100         150         120
2           200         250         180

上記のクエリでは、sales_date列の値を列名に変換するためにPIVOT演算子が使用され、それに加えて各product_idとsales_dateの組合わせごとの売上金額の合計が計算されています。

Oracle 11g以降では、PIVOT演算子が使用可能です。古いバージョンをお使いの場合は、別の処理方法が必要になる可能性があります。

bannerAds