2009-04-29 142 views
8

我有一個列表sales(int)month(int)。我想檢索每個月對應的銷售額總和。我需要以12列的形式輸出每個月份的相應數據,其中每個列(月份)將包含一個包含銷售額的單個記錄。SQL服務器:將行轉換爲列

回答

10

你應該看看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 
+0

你應該顯示2008年之前的常規INSERT語法 – 2009-04-29 15:50:17

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] 
1

你可以用OLAP做到這一點。 Here是有關該主題的MSDN文檔的另一個鏈接。

使用OLAP,您可以使用所需信息創建一個包含所需佈局的多維數據集。

如果您不想這樣做,您將不得不使用.NET,Java,TransacSQL或您的首選語言創建彙總表來操作SQLServer數據。

2

下面是另一種編寫數據透視表的方法,它可以提供更多的控制權(特別是在列名上)。爲其生成動態SQL也更容易一些。

它類似羅賓的答案,但有隻打一次表的優點是:

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); 

,並獲得逆轉置數據...

0

要輕鬆轉成列排其名稱應該使用XML。在我的博客中,我用例子描述了這個:Link