열 이름을 UNPIVOT에 동적으로 전달


10

다음 데이터가있는 테이블이 있습니다

First         Second        Third         Fourth        Fifth         Sixth
2013-08-20    2013-08-21    2013-08-22    2013-08-23    2013-08-24    2013-08-25

그리고 사용 UNPIVOT

SELECT Data
    ,DATENAME(DW, Data) AS DayName
FROM Cal
UNPIVOT(Data FOR D IN (
            First,
            Second,
            Third,
            Fourth,
            Fifth,
            Sixth  )) AS unpvt

나는 다음과 같은 결과를 얻는다

Data        DayName
2013-08-20  Tuesday
2013-08-21  Wednesday
2013-08-22  Thursday
2013-08-23  Friday
2013-08-24  Saturday
2013-08-25  Sunday

이제 내 질문은 열의 이름을 동적으로 전달 UNPIVOT하여 테이블의 열이 증가 할 때 명령문을 변경하지 않아도 될 수 있다는 것입니다.

답변:


14

피벗 해제해야하는 알 수없는 열 수를 가지려면 동적 SQL 구현을 살펴 봐야합니다.

테이블 sys.columns에있는 모든 열의 이름을 얻는 데 사용할 수 있습니다 cal. 다음 쿼리를 사용하면 테이블의 모든 열 목록이 표시됩니다.

select C.name
from sys.columns c
where c.object_id = OBJECT_ID('dbo.cal') 

이제이 쿼리를 함께 FOR XML PATH사용하여 실행할 문자열에 연결할 쉼표로 구분 된 이름 목록을 만들 수 있습니다.

select @colsUnpivot 
  = stuff((select ','+quotename(C.name)
           FROM sys.columns c
           WHERE c.object_id = OBJECT_ID('dbo.cal') 
           for xml path('')), 1, 1, '')

마지막으로이 목록을 가져 와서 실행되도록 쿼리 문자열에 배치하면 전체 쿼리가 다음과 같이 표시됩니다.

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

select @colsUnpivot 
  = stuff((select ','+quotename(C.name)
           FROM sys.columns c
           WHERE c.object_id = OBJECT_ID('dbo.cal') 
           for xml path('')), 1, 1, '')

set @query 
  = 'select data, datename(dw, data) dayname
     from cal
     unpivot
     (
        data
        for d in ('+ @colsunpivot +')
     ) u'

exec sp_executesql @query;

데모가 포함 된 SQL Fiddle 참조

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.