我有一个包含sales(int)
列,month(int)
的表格。我想检索每个月对应的销售总额。我需要以每个月对应的12列的形式输出,其中将有一个包含每列(月)销售额的记录。
答案 0 :(得分: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
答案 1 :(得分: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]
答案 2 :(得分: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;
我做了一些调查,似乎新的pivot运算符只是这类查询的语法糖。查询计划最终看起来完全相同。
作为一个有趣的方面,univot运算符似乎也只是语法糖。例如:
如果你有一个像这样的表:
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 );
获取不透明的数据......
答案 3 :(得分:1)
您可以使用OLAP执行此操作。 Here是关于该主题的MSDN文档的另一个链接。
使用OLAP,您可以使用所需的布局创建包含所需信息的多维数据集。
如果您不想这样做,则必须使用.NET,Java,TransacSQL或首选语言创建汇总表来操作SQLServer数据。
答案 4 :(得分:0)
要轻松地将列转换为具有其名称的行,您应该使用XML。在我的博客中,我通过示例对此进行了描述:Link