2013-02-15 4 views
2

다음 표의 날짜 필드에서 동적으로 테이블을 피벗시키는 가장 좋은 방법을 찾으려고합니다. 문제는이 날짜가 변경되어 피벗 명령문에 하드 코드를 넣을 수 없다는 것입니다.동적 필드가있는 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 

나는 당신이 당신이 PIVOT 기능을 사용할 수 있습니다, SQL 서버를 사용하고 있기 때문에 출력이

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 서버 동적 PIVOT 쿼리를?] sql-server-dynamic-pivot-query) – RichardTheKiwi

답변

5

처럼 보이게합니다.

당신의 가치를 알고있는 경우에, 당신을 하드 코딩 할 수 있습니다 값 :

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')