質問
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 );
そして、ピボットされていないデータを取得する...
列をその名前の行に簡単に転置するには、XMLを使用する必要があります。私のブログでは、例を使ってこれについて説明しました:リンク
所属していません StackOverflow