2013-06-14 3 views
0

열을 행으로 조 변경해야하지만 미리 정의 된 열이 필요하므로 PIVOT을 사용하고 싶지 않습니다 (열이 동적 일 수 있음). 그래서, 그 해결책은 동적 SQL을 PIVOT과 함께 사용하는 것이지만 동적 SQL을 사용하고 싶지 않기 때문에 다른 정적 SQL과 결합하여 다른 결과 세트를 생성하고 싶을 것입니다. 다른 옵션은 무엇입니까?동적 SQL 및 하드 코드 된 열이없는 SQL Server Transpose

여기 내 원래 SQL 결과입니다 :

EmpID|MonthYear|HoursWorked 
10 |Jan 2013 |160 
10 |Feb 2013 |150 
10 |Mar 2013 |140 
20 |Jan 2013 |130 
20 |Feb 2013 |170 
20 |Mar 2013 |155 

와 전치 결과는 다음과 같아야합니다 : 당신은 당신이 열로 전환 할 값의 알 수없는 번호가 불행히도 경우

EmpID|Jan 2013|Feb 2013|Mar 2013 
10 |160  |150  |140 
20 |130  |170  |155 

답변

0

, 동적 SQL을 사용해야합니다. 쿼리가 실행될 때 새 열을 알아야하므로 실행중인 쿼리 문자열의 일부 여야합니다.

당신은 유사한 무언가를 사용해야합니다 당신이 쿼리에 포함 할 열 목록 얻기 위해 다음

select @cols = STUFF((SELECT ',' + QUOTENAME(datename(m, monthyear) + ' ' 
             + cast(year(monthyear) as char(4))) 
        from yourtable 
        group by monthyear 
        order by monthyear 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

하는 것은 그 다음 PIVOT 결과를 생성하는 전체 스크립트는 다음과 같습니다

다른 테이블이 결과에 가입하려면
DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(datename(m, monthyear) + ' ' 
             + cast(year(monthyear) as char(4))) 
        from yourtable 
        group by monthyear 
        order by monthyear 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT empid,' + @cols + ' 
      from 
      (
       select empid, 
        datename(m, monthyear) + '' '' 
          + cast(year(monthyear) as char(4)) monthyear, 
        hoursworked 
       from yourtable 
      ) src 
      pivot 
      (
       sum(hoursworked) 
       for monthyear in (' + @cols + ') 
      ) p ' 

execute(@query); 

SQL Fiddle with Demo

를 참조하십시오, 당신은 쉽게 당신의 동적 SQL 문자열에 가입하거나 coul 포함 할 수 있습니다 d 결과를 결합 할 수있는 임시 테이블에 놓습니다.