2013-02-15 40 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')