SQL Server 2008 で列名をピボット解除:3 つの方法とそれぞれの利点と欠点
SQL Server 2008 で列名をピボット解除する方法
SQL Server 2008 には、UNPIVOT 関数を使用して列名をピボット解除する機能があります。これは、列を複数の行に変換する操作です。
この操作は、データ分析やレポート作成において、データをより整理しやすく、理解しやすくするのに役立ちます。
例
次の表があるとします。
製品ID | 製品名 | 2023年1月 | 2023年2月 | 2023年3月 |
---|---|---|---|---|
1 | ノートパソコン | 100 | 120 | 150 |
2 | スマートフォン | 50 | 60 | 70 |
3 | タブレット | 30 | 40 | 50 |
この表をピボット解除すると、次のようになります。
製品名 | 月 | 売上 |
---|---|---|
ノートパソコン | 2023年1月 | 100 |
ノートパソコン | 2023年2月 | 120 |
ノートパソコン | 2023年3月 | 150 |
スマートフォン | 2023年1月 | 50 |
スマートフォン | 2023年2月 | 60 |
スマートフォン | 2023年3月 | 70 |
タブレット | 2023年1月 | 30 |
タブレット | 2023年2月 | 40 |
タブレット | 2023年3月 | 50 |
UNPIVOT 関数の構文
UNPIVOT
(
value_column
FOR each_column
IN
(
column_name1
[
, column_name2
...
]
)
)
AS unpivot_table
説明
value_column
: ピボット解除する列を指定します。each_column
: ピボット解除する列ごとに新しい列を作成するために使用する列を指定します。column_name1, column_name2...
:each_column
パラメータで指定した列の名前をカンマ区切りで指定します。
上記の例では、次のクエリを使用して表をピボット解除します。
SELECT
ProductName,
[Month],
Sale
FROM
(
SELECT
ProductID,
ProductName,
[2023年1月] AS '2023年1月',
[2023年2月] AS '2023年2月',
[2023年3月] AS '2023年3月'
FROM
YourTable
) AS SourceTable
UNPIVOT
(
Sale
FOR Month
IN
(
'2023年1月',
'2023年2月',
'2023年3月'
)
)
AS unpivot_table
補足
UNPIVOT
関数に加えて、PIVOT
関数を使用して行を列に変換することもできます。- より複雑なピボット解除を実行するには、CASE 式と集計関数を使用することができます。
製品ID | 製品名 | 2023年1月 | 2023年2月 | 2023年3月 |
---|---|---|---|---|
1 | ノートパソコン | 100 | 120 | 150 |
2 | スマートフォン | 50 | 60 | 70 |
3 | タブレット | 30 | 40 | 50 |
SELECT
ProductName,
[Month],
Sale
FROM
(
SELECT
ProductID,
ProductName,
[2023年1月] AS '2023年1月',
[2023年2月] AS '2023年2月',
[2023年3月] AS '2023年3月'
FROM
YourTable
) AS SourceTable
UNPIVOT
(
Sale
FOR Month
IN
(
'2023年1月',
'2023年2月',
'2023年3月'
)
)
AS unpivot_table
- このクエリは、YourTable という名前の表からデータを抽出します。
SELECT
ステートメントは、ProductName
、Month
、およびSale
の列を選択します。FROM
ステートメントは、SourceTable という名前の派生表を参照します。- SourceTable は、YourTable の列を個別の列に変換します。
UNPIVOT
関数は、Sale 列をピボット解除し、Month 列を新しい列名として使用します。IN
句は、Month
列で使用される値を指定します。
結果
このクエリを実行すると、次の結果が得られます。
製品名 | 月 | 売上 |
---|---|---|
ノートパソコン | 2023年1月 | 100 |
ノートパソコン | 2023年2月 | 120 |
ノートパソコン | 2023年3月 | 150 |
スマートフォン | 2023年1月 | 50 |
スマートフォン | 2023年2月 | 60 |
スマートフォン | 2023年3月 | 70 |
タブレット | 2023年1月 | 30 |
タブレット | 2023年2月 | 40 |
タブレット | 2023年3月 | 50 |
- この例は、最も基本的なピボット解除操作を示しています。
- 詳細については、SQL Server のドキュメントを参照してください。
SQL Server 2008 で列名をピボット解除するその他の方法
SQL Server 2008 で列名をピボット解除するには、UNPIVOT 関数以外にもいくつかの方法があります。
以下に、その他の一般的な方法と、それぞれの利点と欠点について説明します。
方法
- CASE 式と集計関数
- 動的 SQL
- ピボット解除変換 (SSIS)
- 個別の列を処理するために
CASE
式を使用します。 - 集計関数を使用して、各月の売上を計算します。
利点:
- 柔軟性が高い。
- 複雑なピボット解除を実行できる。
- コードが冗長になる可能性がある。
- 読みづらくなる可能性がある。
SELECT
ProductName,
[Month],
SUM(Sale) AS Sale
FROM
(
SELECT
ProductID,
ProductName,
[2023年1月] AS '2023年1月',
[2023年2月] AS '2023年2月',
[2023年3月] AS '2023年3月'
FROM
YourTable
) AS SourceTable
GROUP BY
ProductName,
[Month]
- 文字列を動的に生成してクエリを実行します。
- ピボット解除する列名を指定できます。
- コードを簡潔に記述できる。
- 複雑なクエリを生成するのは難しい場合があります。
DECLARE @cols NVARCHAR(MAX), @query NVARCHAR(MAX);
SET @cols = N'';
SELECT @cols = @cols + ',' + QUOTENAME(column_name)
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = N'YourTable'
AND COLUMN_NAME IN
(
N'2023年1月',
N'2023年2月',
N'2023年3月'
);
SET @query = N'
SELECT
ProductName,
[Month],
Sale
FROM
(
SELECT
ProductID,
ProductName,
' + @cols + '
FROM
YourTable
) AS SourceTable
UNPIVOT
(
Sale
FOR Month
IN
(' + @cols + ')
)
AS unpivot_table
';
EXEC sp_executesql @query;
- SQL Server Integration Services (SSIS) の変換を使用して、列名をピボット解除します。
- コードを書く必要がない。
- 視覚的にわかりやすい。
- SSIS をインストールする必要がある。
- データフロータスクを使用する必要がある。
手順
- SSIS パッケージを作成します。
- データフロータスクを追加します。
- ピボット解除変換を追加します。
- パッケージを実行します。
上記以外にも、ピボット解除を実行するためのツールやライブラリがいくつかあります。
sql sql-server sql-server-2008