SQL:如何创建二维数据透视表

时间:2014-10-30 15:04:17

标签: sql sql-server

我有员工月销售汇总数据记录的列

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

缺点是它不具有可扩展性或灵活性(每月必须返回添加新的月份代码,另外,如果我们更改日期编码格式,则此查询必须完全重新书面)。

所以我只是想知道你们是否都知道更好的方法呢?

1 个答案:

答案 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;