我有员工月销售汇总数据记录的列
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
缺点是它不具有可扩展性或灵活性(每月必须返回添加新的月份代码,另外,如果我们更改日期编码格式,则此查询必须完全重新书面)。
所以我只是想知道你们是否都知道更好的方法呢?
答案 0 :(得分:-1)
您想要进行动态调整。您可以使用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;