我有一個列表sales(int)
,month(int)
。我想檢索每個月對應的銷售額總和。我需要以12列的形式輸出每個月份的相應數據,其中每個列(月份)將包含一個包含銷售額的單個記錄。SQL服務器:將行轉換爲列
8
A
回答
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
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
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
相關問題
- 1. 如何將行轉換爲SQL服務器中的列
- 2. SQL服務器 - 轉換列行
- 3. 轉換一些列與列標題爲行SQL服務器
- 4. SQL將行轉換爲列
- 5. SQL將行轉換爲列
- 6. 將SQL列轉換爲行
- 7. SQL將行轉換爲列
- 8. 將sql行轉換爲列
- 9. SQL服務器:如何將行轉換成列
- 10. SQL服務器將字符串轉換爲日期列
- 11. 轉換爲varchar日期 - SQL服務器
- 12. 將行轉換爲列SQL Server,T-SQL
- 13. 將訪問SQL轉換爲SQL服務器
- 14. SQL服務器轉行的列值
- 15. 將SQL列轉換爲ID爲的行
- 16. 轉列轉換爲行SQL
- 17. 服務器將JSON轉換爲fronend
- 18. 將兩列轉換爲兩個逗號分隔的列表在sql服務器
- 19. 怎麼行轉換爲列,如果列SQL服務器的數目不詳
- 20. SQL服務器:從CTE轉換行到列
- 21. SQL服務器:打開行轉換成列
- 22. SQL服務器:轉換行到列的無支點和分組
- 23. 將http服務器轉換爲https服務器需要什麼?
- 24. SQL Server將行轉換爲列
- 25. 將列轉換爲行的SQL查詢
- 26. 將列轉換爲SQL Server中的行
- 27. 將行轉換爲sql表中的列
- 28. SQL將多列轉換爲行
- 29. 使用SQL將行轉換爲列
- 30. 將列轉換爲行的SQL查詢
你應該顯示2008年之前的常規INSERT語法 – 2009-04-29 15:50:17