sql - 在 T-SQL 中透视数据

标签 sql sql-server tsql 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 

这张表可以而且确实会持续很多年......

有没有一种方法可以在如下所示的表中对该表进行透视(据我所知,实际上不需要聚合,这通常是在透视中完成的)?

     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 )

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

其他示例:

关于sql - 在 T-SQL 中透视数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7232593/

相关文章:

sql-server - 为什么T-SQL中一些不带参数的系统函数有括号,而另一些则没有?

sql - 在 SQL Server 中生成序列,交叉应用性能不佳

mysql - Codeception DB模块异常

sql - 更新标识列中的值

sql - Postgresql - 将外键更改为另一列

SQL Sum 当天的多个值

sql - TSQL 递增一列并基于另一列重新开始

sql - 如何聚合描述列?

sql - 如果不存在行,如何让 SQL Server 返回默认值 0?

sql - T-SQL 不像预期的那样工作 - 返回的命中次数少于使用 = 的相同查询