在T-SQL中支持数据

我有一群人。 让我们称他们为A,B,C。 我有一个表格,显示他们每个月支付了多less….

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 

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

如果您使用的是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 ) 

无论您拥有多less不同的身份,这都会起作用。 它用PIVOTdynamic地组装一个查询。 你可以用dynamic列做PIVOT的唯一方法是dynamic组装查询,这可以在SQL Server中完成。

其他例子:

  • SQL Server的PIVOT也许?
  • 如何通过使用SQL Server连接到单个表来构build摘要?

我不知道为什么你需要一个dynamic的专栏,因为一年总是有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