SQL:如何创建二维透视表



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

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;

最新更新