データベースのデータをより見やすくするために、縦持ちデータを横持ちデータに変換することがあります。この記事では、Oracleデータベースで縦持ちデータを横持ちデータに変換する方法を、具体的な例を交えて紹介します。
縦持ちデータとは
縦持ちデータとは、データが行方向に持たれている形式のことを指します。例えば、売上データが以下のように保存されている場合です。
月 | 商品 | 売上金額 |
---|---|---|
1月 | 商品A | 1000 |
1月 | 商品B | 1500 |
2月 | 商品A | 2000 |
2月 | 商品B | 2500 |
この形式では、各商品の売上が行として表示されています。
横持ちデータとは
横持ちデータとは、データが列方向に持たれている形式のことを指します。上記の縦持ちデータを横持ちデータに変換すると、次のようになります。
月 | 商品A | 商品B |
---|---|---|
1月 | 1000 | 1500 |
2月 | 2000 | 2500 |
この形式では、各商品の売上が列として表示されています。
Oracleでの縦持ちデータを横持ちデータに変換する方法
Oracleデータベースでは、PIVOT句を使用して縦持ちデータを横持ちデータに変換することができます。以下にその具体的な方法を示します。
まず、基本的なPIVOT句の使用例を紹介します。
SELECT *
FROM (
SELECT 月, 商品, 売上金額
FROM 売上
)
PIVOT (
SUM(売上金額)
FOR 商品 IN ('商品A' AS 商品A, '商品B' AS 商品B)
);
このSQLを実行すると、縦持ちの売上データが横持ちデータに変換されます。
このSQLでは、まずサブクエリで元の売上データを取得します。具体的には、月、商品、売上金額の列を選択しています。次に、PIVOT句を使用してデータを変換します。ここでは、売上金額の合計を計算し、商品ごとに列を作成して、それぞれにエイリアスを設定しています。これにより、縦持ちのデータが横持ちに変換され、各商品の売上が列として表示されるようになります。
応用例: 動的な商品リストのPIVOT
商品が動的に変わる場合、PL/SQLを使用して動的にPIVOT句を生成することもできます。以下は、その例です。
DECLARE
v_sql VARCHAR2(4000);
BEGIN
SELECT 'SELECT * FROM (SELECT 月, 商品, 売上金額 FROM 売上) PIVOT (SUM(売上金額) FOR 商品 IN ('
|| LISTAGG('''' || 商品 || ''' AS ' || 商品, ', ') WITHIN GROUP (ORDER BY 商品)
|| '));'
INTO v_sql
FROM (SELECT DISTINCT 商品 FROM 売上);
EXECUTE IMMEDIATE v_sql;
END;
このスクリプトを使用すると、動的に商品リストを取得し、PIVOT句を生成して実行することができます。
まとめ
この記事では、Oracleデータベースで縦持ちデータを横持ちデータに変換する方法について、具体的な例を用いて説明しました。PIVOT句を使用することで、データをより見やすく、分析しやすくすることができます。動的な商品リストにも対応できるよう、PL/SQLを活用する方法も紹介しました。これらの方法を活用して、データの変換を効率的に行いましょう。