質問

sales(int) month(int)の列を持つテーブルがあります。毎月の売上合計を取得したい。各月に対応する12列の形式の出力が必要で、各列の売上を含む単一のレコード(月)があります。

役に立ちましたか?

解決

列を持つ行を切り替えるには、 PIVOT をご覧ください。 。これにより、各月の選択ステートメントが防止されます。このようなもの:

DECLARE @salesTable TABLE
(
    [month] INT,
    sales INT
)

-- Note that I use SQL Server 2008 INSERT syntax here for inserting
-- multiple rows in one statement!
INSERT INTO @salesTable
VALUES (0, 2) ,(0, 2) ,(1, 2) ,(1, 2) ,(2, 2)
      ,(3, 2) ,(3, 2) ,(4, 2) ,(4, 2) ,(5, 2)
      ,(6, 2) ,(6, 2) ,(7, 2) ,(8, 2) ,(8, 2)
      ,(9, 2) ,(10, 2) ,(10, 2) ,(11, 2) ,(11, 2)

SELECT [0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]
FROM
(
    SELECT [month], sales
    FROM @salesTable
) AS SourceTable
PIVOT
(
    SUM(sales)
    FOR [month] IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11])
) AS PivotTable

他のヒント

きれいではない...しかしこれはうまくいく

SELECT
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 1) [Sales1],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 2) [Sales2],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 3) [Sales3],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 4) [Sales4],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 5) [Sales5],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 6) [Sales6],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 7) [Sales7],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 8) [Sales8],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 9) [Sales9],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 10) [Sales10],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 11) [Sales11],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 12) [Sales12]

ピボットを記述するもう1つの方法を使用して、もう少し制御できるようにします(特に列名について)。動的SQLを生成するのも少し簡単です。

これはロビンの答えに似ていますが、テーブルに1回しかヒットしないという利点があります。

select
  Sales1 = sum( case when Month = 1 then Sales end )
, Sales2 = sum( case when Month = 2 then Sales end )
, Sales3 = sum( case when Month = 3 then Sales end )
-- etc..
from SalesTable;

調査を行ったところ、新しいピボット演算子は、このタイプのクエリの単なる構文シュガーのようです。クエリプランは同じように見えます。

おもしろいことに、unpivot演算子も単なる構文糖のようです。例:

次のようなテーブルがある場合:

Create Table Sales ( JanSales int, FebSales int, MarchSales int...)

書くことができます:

 select unpivoted.monthName, unpivoted.sales
 from Sales s
 outer apply (
    select 'Jan', JanSales union all
    select 'Feb', FebSales union all
    select 'March', MarchSales
 ) unpivoted( monthName, sales );

そして、ピボットされていないデータを取得する...

OLAP で実行できます。 こちらは、トピックに関するMSDNドキュメントへの別のリンクです。

OLAPを使用すると、必要なレイアウトを使用して、持っている情報を使用してキューブを作成できます。

そのようにしたくない場合は、.NET、Java、TransacSQL、または好みの言語でサマリーテーブルを作成して、SQLServerデータを操作する必要があります。

列をその名前の行に簡単に転置するには、XMLを使用する必要があります。私のブログでは、例を使ってこれについて説明しました:リンク

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top