2013-02-15 64 views
2

试图找出在下表中的日期字段上动态转移表的最佳方法。问题是这些日期的变化,所以我不能在pivot语句中硬编码它们。SQL Server支持动态字段

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 
+0

的可能重复(http://stackoverflow.com/questions/10404348/ [SQL Server的动态PIVOT查询?] SQL服务器动态枢轴查询) – RichardTheKiwi 2013-05-03 09:25:00

回答

5

由于您使用的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) | 
0

试试这个

DECLARE @columns VARCHAR(8000) 

-- set columns for pivot 
SELECT @columns = COALESCE(@columns + ',[' + cast([date] as varchar(50)) + ']', '[' + cast([date] as varchar(50))+ ']')   
    FROM TableName 

EXEC(' SELECT *, ' + @columns + ' FROM 
     (
      SELECT * FROM TableName 
     ) As a 
     PIVOT (MAX(value) FOR DATE IN (' + @columns + ')) As P')