我有员工月份销售汇总数据记录的列
Employee ID - Month of Sales - $ amount
2 Nov 2013 255
2 Aug 2013 314
15 Jan 2014 86
我想要相同的数据,但在像这样的二维数据表中
Employee ID - Jan 2013 - Feb 2013 - Mar 2013
2 179 122 567
3 255 314 789
4 271 86 213
现在我的想法是每月写一次案例陈述,比如这个
(CASE
WHEN MONTH = 'JAN 2013' THEN $ AMOUNT
ELSE 0
END)
AS JAN 2013
这样做的缺点是它不可扩展或不灵活(必须每月返回以添加新的月份代码,此外,如果我们更改日期编码格式,则必须完全重写此查询)。
所以我只是想知道你们是否知道更好的方法?
您想要做一个动态枢轴。您可以使用STUFF函数获取Month_of_sales的列表,然后使用该列表创建查询。以下是它的样子:
create table #test (employee_ID int, Month_Of_Sales varchar(50), Amount int)
insert into #test
values (2, 'Nov 2013', 255),
(2, 'Aug 2013', 314),
(15, 'Jan 2014', 86)
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF(
(SELECT distinct ',['+Month_Of_Sales+']' AS Month_Of_Sales
FROM #test
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT Employee_ID, ' + @cols + '
from ( select
employee_ID, Month_Of_Sales, isnull(Amount,0) as Amount
from #test
) as source
pivot
(
sum(Amount) For Month_Of_Sales in (' + @cols + ')
) as PivotTable'
execute sp_executesql @query;