2014-10-30 49 views
0

我有一个员工的月销售汇总数据记录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语句,如该

(CASE 
WHEN MONTH = 'JAN 2013' THEN $ AMOUNT 
ELSE 0 
END) 
AS JAN 2013 

的缺点这是不可扩展或灵活的(如果我们更改日期编码格式,则必须每个月回去添加一个新的月份代码,此外,这个查询将不得不完全重写)。

所以我只是想知道你们是否知道更好的方法来做到这一点?

+0

为什么要将MonthOfSales存储为字符数据?它应该是日期时间。否则,你会遇到各种非常痛苦的问题。 – 2014-10-30 15:10:18

+2

您需要使用动态SQL。这些方法在MySQL和SQL Server中相当不同,所以你的问题是不可能回答的。无论如何,您可以通过Google搜索“<您的数据库>动态数据透视表”来获得答案。 – 2014-10-30 15:12:39

+0

无法从* that *数据集生成* this *结果集。 – Strawberry 2014-10-30 15:32:20

回答

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