在T-SQL中透视数据

JBo*_*one 5 sql t-sql sql-server pivot

我有一群人.让我们称他们为A,B,C.我有一张桌子,显示他们每个月的工资是多少....

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 
Run Code Online (Sandbox Code Playgroud)

这张表可以并且确实会持续多年和多年.

有没有办法透过这个表(没有什么,因为我看到真正需要聚合,这通常在枢轴中完成)在一个看起来如下的表?

     JAN    FEB    MAR    APR    MAY    JUN    JUL    AGU    SEP
A    10     20
B    10     20     -      -      -      -      -      -      30
C    10     -      -      -      -      20     30     -      40
Run Code Online (Sandbox Code Playgroud)

以前没有碰到这样的事情但是假设这是一个常见的问题吗?

Adr*_*iro 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 )
Run Code Online (Sandbox Code Playgroud)

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

其他例子: