sql-server - 具有动态字段的 SQL Server Pivot

标签 sql-server pivot

尝试找出根据下表中的日期字段动态透视表的最佳方法。问题是这些日期发生了变化,所以我无法在数据透视语句中对它们进行硬编码。

id value date
1  55    2012-12-29 00:00:00:00
1  54    2012-10-29 00:00:00:00
1  89    2013-02-02 00:00:00:00
2  45    2012-12-29 00:00:00:00
2  54    2012-10-29 00:00:00:00
4  78    2012-12-29 00:00:00:00
4  90    2012-10-29 00:00:00:00
4  23    2012-10-29 00:00:00:00

我希望输出看起来像这样

id 2012-12-29 00:00:00:00 2012-10-29 00:00:00:00 2013-02-02 00:00:00:00
1   55                    54                     89
2   45                    54                     null
4   78                    90                     23

最佳答案

由于您使用的是 SQL Server,因此您可以使用 PIVOT 功能。

如果您的值已知,那么您可以对这些值进行硬编码:

select *
from
(
  select id, value, date
  from yourtable
) src
pivot
(
  max(value)
  for date in ([2012-12-29], [2012-10-29], [2013-02-02])
) piv

参见SQL Fiddle with Demo .

但是如果它们未知,那么您将需要使用动态sql:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(varchar(50), date, 120)) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, ' + @cols + ' from 
             (
                select id, value, convert(varchar(50), date, 120) date
                from yourtable
            ) x
            pivot 
            (
                max(value)
                for date in (' + @cols + ')
            ) p '

execute(@query)

参见SQL Fiddle with Demo .

两个查询的结果是:

| ID | 2012-10-29 00:00:00 | 2012-12-29 00:00:00 | 2013-02-02 00:00:00 |
------------------------------------------------------------------------
|  1 |                  54 |                  55 |                  89 |
|  2 |                  54 |                  45 |              (null) |
|  4 |                  90 |                  78 |              (null) |

关于sql-server - 具有动态字段的 SQL Server Pivot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14902626/

相关文章:

c# - 是否不能在同一个数据透视页中放置多个网格?

sql - 数据库占用的空间比表的总和还要多

sql-server - SQL Server 向上舍入日期时间

sql - 在 SQL 中查询比较日期

python - Pandas Pivot with Strings-ValueError : Index contains duplicate entries, 无法 reshape

sql - 小计和总计 SQL Pivot

sql - 在 MS SQL Server 中对所有选择字段进行分组的更好方法

sql-server - 将时间戳数据类型更改为 rowversion

sql - 关于 SQL 数据透视查询

sql-server - SQL 服务器 2008 R2 : Dynamic query for pivot table with where and having clause