【Oracle】縦持ちデータを横持ちデータに変換する方法

データベースのデータをより見やすくするために、縦持ちデータを横持ちデータに変換することがあります。この記事では、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を活用する方法も紹介しました。これらの方法を活用して、データの変換を効率的に行いましょう。