SQL ServerでPIVOTを使用して行を列に変換する方法

2024-04-02

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


NULL値の謎を解き明かす!SQL ServerでNULL値のみを含む列を選択する4つの方法

SQL Serverで、NULL値のみを含む列を選択するには、いくつかの方法があります。ここでは、最も一般的な方法を紹介します。方法IS NULL演算子を使用するIS NULL演算子は、値がNULLかどうかを確認するために使用されます。この演算子を使用して、NULL値のみを含む列を選択するには、次のクエリを使用します。...


SQLで高度な検索を実現する: LIKE検索と全文検索を使い分ける

全文検索は、データベース内の文書全体を検索する手法です。検索クエリは、単語、フレーズ、または文全体で構成できます。全文検索エンジンは、各文書のインデックスを作成し、クエリとの関連性を分析することで、検索結果を返します。メリット:単語の順序や位置を考慮した検索が可能...


PostgreSQLでCTEを使用して3つのテーブルに一度にデータを挿入する方法

PostgreSQLでは、CTE (Common Table Expression)と呼ばれる機能を使用して、複雑なクエリをより読みやすく、メンテナンスしやすいモジュール化された部分に分割することができます。CTEを使用して、3つのテーブルに一度にデータを挿入することもできます。...


PostgreSQL: DISTINCT ON、GROUP BY、FIRST_VALUEで各IDの最後の行をスマートに抽出

このチュートリアルでは、PostgreSQL で 各 ID の最後の行 を効率的に抽出する方法について説明します。 複数の方法がありますが、それぞれ長所と短所があります。状況に応じて最適な方法を選択することが重要です。方法 1: サブクエリを使用した ORDER BY...