Oracle SQLでUNPIVOTを使って複数のカラムを縦に並べる方法

Oracle

Oracle SQLで、複数のカラムを縦に並べるためにUNPIVOTを使いたい場合、いくつかのポイントを押さえておく必要があります。この記事では、ID、大分類、中分類、値を縦に並べる方法を解説します。具体的なコード例を交えながら、UNPIVOTを使用した実装方法を説明します。

1. UNPIVOTを使う基本的な方法

UNPIVOTは、複数のカラムを1つのカラムにまとめて縦方向に変換するためのSQL機能です。これを使うことで、横方向に並んでいるデータを縦方向に変換できます。しかし、指定した大分類や中分類を適切に指定しないと、正しい結果が得られません。

まず、基本的なUNPIVOTの使用方法は以下のようになります。例として、項目を縦に並べるケースを見てみましょう。

SELECT ID, 大分類, 中分類, 値
FROM (
    SELECT ID, 項目_1, 項目_2, 項目_3, ポイント_1, ポイント_2, ボーナス_1
    FROM テーブル名
) UNPIVOT (
    値 FOR 大分類 IN (項目_1, 項目_2, 項目_3, ポイント_1, ポイント_2, ボーナス_1)
) AS unpivoted

上記のSQLでは、各項目を縦に並べ、大分類として各項目を持つ新しい列が作成されます。

2. 大分類と中分類を取り扱う方法

質問のように、大分類と中分類を分けて縦に並べる場合、`大分類`と`中分類`を定義する必要があります。これを実現するには、UNPIVOT後にCASE式を使って分類を分ける方法が考えられます。

SELECT ID,
    CASE
        WHEN 大分類 IN ('項目_1', '項目_2', '項目_3') THEN '01'
        WHEN 大分類 IN ('ポイント_1', 'ポイント_2') THEN '02'
        WHEN 大分類 = 'ボーナス_1' THEN '03'
    END AS 大分類,
    CASE
        WHEN 大分類 = '項目_1' THEN '0101'
        WHEN 大分類 = '項目_2' THEN '0101'
        WHEN 大分類 = '項目_3' THEN '0101'
        WHEN 大分類 = 'ポイント_1' THEN '0201'
        WHEN 大分類 = 'ポイント_2' THEN '0201'
        WHEN 大分類 = 'ボーナス_1' THEN '0301'
    END AS 中分類,
    値
FROM (
    SELECT ID, 項目_1, 項目_2, 項目_3, ポイント_1, ポイント_2, ボーナス_1
    FROM テーブル名
) UNPIVOT (
    値 FOR 大分類 IN (項目_1, 項目_2, 項目_3, ポイント_1, ポイント_2, ボーナス_1)
) AS unpivoted

このSQLでは、`CASE`文を使って大分類と中分類を分け、適切な値を返しています。これにより、必要な結果が得られるようになります。

3. 結果の整形と確認

UNPIVOTを使ってデータを縦に並べた後、結果が期待通りであることを確認するために、データの整形を行います。具体的には、ID、カテゴリ(大分類、中分類)、値が正しく整列されているかを確認し、必要に応じてさらにフィルタリングや並べ替えを行います。

以下は、期待される結果例です。

ID  大分類  中分類  値
100001 01 0101 10
100001 01 0101 2
100001 01 0101 5
100001 02 0201 6
100001 02 0201 7
100001 03 0301 0
100002 01 0101 1
100002 01 0101 11
100002 01 0101 7
100002 02 0201 2
100002 02 0201 1
100002 03 0301 10

これで、大分類、中分類、値が正しく縦に並んだ結果が得られます。

4. まとめ

Oracle SQLのUNPIVOTを使用することで、複数のカラムを縦に並べる処理が簡単に実現できます。大分類や中分類を使い分ける場合は、`CASE`文を活用して分類を行い、必要な情報を整形することが重要です。

UNPIVOTを使うことで、データの視覚化や分析がより効率的に行えるようになり、特に大量のデータを扱う際に非常に有効です。

コメント

タイトルとURLをコピーしました