sales(int)
列のあるテーブルがありますmonth(int)
。毎月対応する売上高を取得したい。各列(月)の売上を含む単一のレコードが存在する、各月に対応する12列の形式の出力が必要です。
22767 次
5 に答える
10
行と列を切り替えるためのPIVOTを確認する必要があります。これにより、毎月のselectステートメントが防止されます。このようなもの:
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
于 2009-04-29T11:28:43.377 に答える
2
きれいではありません...しかし、これはうまくいきます
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]
于 2009-04-29T11:26:41.430 に答える
2
これは、(特に列名を)もう少し制御できるピボットを作成する別の方法です。の動的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 );
そして、ピボットされていないデータを取得します...
于 2009-05-01T00:17:32.690 に答える
0
列をその名前の行に簡単に転置するには、XMLを使用する必要があります。私のブログでは、これを例で説明しました:リンク
于 2011-04-08T13:34:43.150 に答える