2011-08-29 61 views
5

我有一群人。让我们称他们为A,B,C。我有一个显示他们是多么每月支付表....T-SQL中的数据透视数据

PERSON|MONTH|PAID 
A  JAN 10 
A  FEB 20 
B  JAN 10 
B  FEB 20 
B  SEP 30 
C  JAN 10 
C  JUNE 20 
C  JULY 30 
C  SEP 40 

这个表可以和它去好多年..

有没有办法转动此表(没有,因为我看到真的需要进行汇总,通常是在枢轴中完成)在一张如下所示的表格中?

 JAN FEB MAR APR MAY JUN JUL AGU SEP 
A 10  20 
B 10  20  -  -  -  -  -  -  30 
C 10  -  -  -  -  20  30  -  40 

有没有遇到过这样的事情,但假设这是一个普遍的问题任何想法?

+0

您仍然可以“聚集“在”MONTH“上。只是在你的数据集中它已经被聚合了。只需使用诸如“SUM”之类的东西。 – Yuck

+0

你可以这样做固定数量的列,Jan..Feb ...,你不能这样做 –

+0

列的变量no ...没有办法做到这一点变量列? – JBone

回答

3

如果您在使用SQL Server 2005(或以上),这里是代码:

DECLARE @cols VARCHAR(1000) 
DECLARE @sqlquery VARCHAR(2000) 

SELECT @cols = STUFF((SELECT distinct ',' + QuoteName([Month]) 
         FROM YourTable FOR XML PATH('')), 1, 1, '') 


SET @sqlquery = 'SELECT * FROM 
     (SELECT Person, Month, Paid 
     FROM YourTable) base 
     PIVOT (Sum(Paid) FOR [Person] 
     IN (' + @cols + ')) AS finalpivot' 

EXECUTE (@sqlquery) 

这将工作,无论你有多少个不同的状态有。它用PIVOT动态地组装一个查询。您可以通过动态列来执行PIVOT的唯一方法是动态组装查询,这可以在SQL Server中完成。

其他例子:

2

我不知道为什么你需要列的动态#,因为总有一年12个月。另外你的月份名称看起来有点不一致。

样品的结果集:

SELECT * FROM (SELECT 'A' [PERSON],'JAN' [MONTH],'10' [PAID] 
UNION SELECT 'A','FEB',20 
UNION SELECT 'B','JAN',10 
UNION SELECT 'B','FEB',20 
UNION SELECT 'B','SEP',30 
UNION SELECT 'C','JAN',10 
UNION SELECT 'C','JUNE',20 
UNION SELECT 'C','JULY',30 
UNION SELECT 'C','SEP',40) AS A 
PIVOT (SUM([PAID]) FOR [MONTH] IN ([JAN],[FEB],[MARCH],[APRIL],[MAY],[JUNE],[JULY],[AUG],[SEP],[OCT],[NOV],[DEC])) p 

反对你的表,这将成为:

SELECT [PERSON],[MONTH],[PAID] 
FROM [YOURTABLE] 
PIVOT (SUM([PAID]) FOR [MONTH] IN ([JAN],[FEB],[MARCH],[APRIL],[MAY],[JUNE],[JULY],[AUG],[SEP],[OCT],[NOV],[DEC])) p 

如果添加了一年列,它看起来是这样的:

SELECT * FROM (SELECT 'A' [PERSON],'JAN' [MONTH],'10' [PAID], 2011 [YEAR] 
UNION SELECT 'A','FEB',20, 2011 
UNION SELECT 'B','JAN',10, 2011 
UNION SELECT 'A','FEB',20, 2010 
UNION SELECT 'B','JAN',10, 2010 
UNION SELECT 'B','FEB',20,2011 
UNION SELECT 'B','SEP',30,2011 
UNION SELECT 'C','JAN',10,2011 
UNION SELECT 'C','JUNE',20,2011 
UNION SELECT 'C','JULY',30,2011 
UNION SELECT 'C','SEP',40,2011) AS A 
PIVOT (SUM([PAID]) FOR [MONTH] IN ([JAN],[FEB],[MARCH],[APRIL],[MAY],[JUNE],[JULY],[AUG],[SEP],[OCT],[NOV],[DEC])) p 
+0

需要动态列,因为我们不想每个月都要重复编写月份 – JBone

+0

如果[YEAR]是固定列,没有理由。看我的第三个例子。 – Kenneth