SQL ServerでPIVOTを使用して行を列に変換する方法
SQL ServerでPIVOTを使用して行を列に変換する方法
SQL ServerのPIVOT句を使用すると、テーブルの行を列に変換できます。これは、データの集計や分析を行う際に、非常に便利な機能です。
基本的な構文
SELECT
[列名1],
PIVOT(
[集計関数]([列名2])
FOR [列名3] IN ([値1], [値2], ...)
) AS [ピボット列名]
FROM [テーブル名]
例
以下の例では、Sales
テーブルのCountry
列を基に、各国の売上を集計し、列に変換しています。
SELECT
[Country],
PIVOT(
SUM([SalesAmount])
FOR [Country] IN ('USA', 'UK', 'Japan')
) AS [TotalSales]
FROM [Sales]
このクエリを実行すると、以下の結果が得られます。
Country | TotalSales
------- | --------
USA | 10000
UK | 8000
Japan | 5000
オプション
PIVOT句には、様々なオプションが用意されています。
- 集計関数: SUM、AVG、COUNTなど、様々な集計関数を指定できます。
- IN句: 列挙する値の代わりに、SELECT文を指定することもできます。
- ORDER BY: ピボット列の並び順を指定できます。
- FOR ... IN ...: 複数の列を基にピボットすることもできます。
PIVOT句の詳細については、以下のリソースを参照してください。
PIVOT句以外にも、CASE式やGROUP BY句などを組み合わせて、行を列に変換することもできます。
SQL ServerのPIVOT句は、テーブルの行を列に変換する便利な機能です。データの集計や分析を行う際に、ぜひ活用してみてください。
各国の売上を集計
SELECT
[Country],
PIVOT(
SUM([SalesAmount])
FOR [Country] IN ('USA', 'UK', 'Japan')
) AS [TotalSales]
FROM [Sales]
各商品の売上と利益を集計
SELECT
[Product],
PIVOT(
SUM([SalesAmount]),
SUM([Profit])
FOR [Product] IN ('Product1', 'Product2', 'Product3')
) AS [SalesAndProfit]
FROM [Sales]
年月別に売上を集計
SELECT
[Year],
PIVOT(
SUM([SalesAmount])
FOR [Month] IN ('January', 'February', 'March')
) AS [MonthlySales]
FROM [Sales]
WHERE [Year] = 2023
SELECT
[Gender],
PIVOT(
SUM([SalesAmount])
FOR [Age] IN ('10-19', '20-29', '30-39')
) AS [SalesByAge]
FROM [Sales]
商品カテゴリと価格帯別に売上を集計
SELECT
[ProductCategory],
PIVOT(
SUM([SalesAmount])
FOR [PriceRange] IN ('100-199', '200-299', '300-399')
) AS [SalesByPriceRange]
FROM [Sales]
これらのサンプルコードを参考に、様々な方法でPIVOT句を活用してみてください。
PIVOT句以外の方法
CASE式を使用して、各行の値を列に変換できます。
SELECT
[Country],
CASE [Country]
WHEN 'USA' THEN SUM([SalesAmount])
WHEN 'UK' THEN SUM([SalesAmount])
WHEN 'Japan' THEN SUM([SalesAmount])
END AS [TotalSales]
FROM [Sales]
GROUP BY句を使用して、グループごとに集計し、列に変換できます。
SELECT
[Country],
SUM([SalesAmount]) AS [TotalSales]
FROM [Sales]
GROUP BY [Country]
CROSS JOINを使用して、すべての行を組み合わせ、列に変換できます。
SELECT
s1.[Country],
s2.[Country] AS [OtherCountry],
SUM(s1.[SalesAmount]) AS [TotalSales]
FROM [Sales] s1
CROSS JOIN [Sales] s2
WHERE s1.[Country] <> s2.[Country]
CTE (Common Table Expression) を使用して、複雑なクエリを複数のステップに分割し、読みやすくすることができます。
WITH SalesByCountry AS (
SELECT
[Country],
SUM([SalesAmount]) AS [TotalSales]
FROM [Sales]
GROUP BY [Country]
)
SELECT
[Country],
[TotalSales]
FROM SalesByCountry
これらの方法は、それぞれ異なる利点と欠点があります。状況に合わせて、最適な方法を選択してください。
PIVOT句を使用するメリット
- シンプルで分かりやすい
- 複雑な集計を簡単に実行できる
- パフォーマンスが低下する場合がある
- 複雑なクエリになると、読みづらくなる
CASE式を使用するメリット
- 柔軟性が高い
- 複雑な条件分岐に対応できる
- 記述量が多くなる
GROUP BY句を使用するメリット
- パフォーマンスが良い
- シンプルなクエリに適している
- 複雑な集計には対応できない
- すべての行を組み合わせることができる
- 笛吹きジョインに適している
- データ量が多くなると、パフォーマンスが低下する
- クエリを分割し、読みやすくできる
- 複雑なクエリを管理しやすくなる
PIVOT句は、行を列に変換する便利な方法ですが、状況に合わせて他の方法も検討してください。
sql sql-server pivot