2012-10-12 3 views
1

가능한 중복의 동적 수 :
SQL Server dynamic PIVOT query?SQL 컬럼에 행을 회전 ... 행

나는 아래의 구조를 가지고 데이터 집합을 가지고있다.

CREATE TABLE #TempTable 
    (
    Measure_ID INT, 
    measurement DECIMAL(18, 4) 
) 

INSERT INTO #TempTable 
VALUES 
(1,2.3) 
,(1,3.4) 
,(1,3.3) 
,(2,3) 
,(2,2.3) 
,(2,4.0) 
,(2,4.5) 

다음과 같이 출력 될 필요가 있습니다.

1,2.3,3.4,3.3 
2,3,2.3,4.0,4.5 

기본적으로 Measure_ID의 피벗입니다. 불행히도, 무제한의 measure_id가있을 수 있습니다. 그래서 피벗이 나옵니다.

저는 CURSORS를 피하기 위해 최선의 방법으로 밝혀지면 CURSORS를 피하려고합니다.

+0

죄송합니다 [이 도움이 될 수 있습니다 (http://www.jadito.us/2012/08/28/rows- to-column-header-using-dynamic-t-sql /)을 사용합니다. 또한 행에서 열로 이동하는 것으로 나타납니다. – Kermit

+0

@Pondlife. 당신이 올바른지. 이것은 그것들과 아주 가깝습니다. 메모 주셔서 감사. –

답변

4

당신이 값을 알 수없는 번호가있는 경우, 당신은 동적 SQL과 함께 PIVOT을 사용할 수 있습니다 : 당신이 값의 알려진 번호가있는 경우

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

select @cols = STUFF((SELECT distinct ',' 
         + QUOTENAME('Measurement_' + cast(rn as varchar(10))) 
        from temptable 
        cross apply 
        (
         select row_number() over(partition by measure_id order by measurement) rn 
         from temptable 
        ) x 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT measure_id, ' + @cols + ' from 
      (
       select measure_id, measurement, 
        ''Measurement_'' 
        + cast(row_number() over(partition by measure_id order by measurement) as varchar(10)) val 
       from temptable 
      ) x 
      pivot 
      (
       max(measurement) 
       for val in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle With Demo

를 참조하십시오, 당신은 보나 수 있습니다 코드이 유사한 값은 :

SELECT measure_id, [Measurement_1], [Measurement_2], 
       [Measurement_3], [Measurement_4] 
from 
(
    select measure_id, measurement, 
    'Measurement_' 
    + cast(row_number() over(partition by measure_id order by measurement) as varchar(10)) val 
    from temptable 
) x 
pivot 
(
    max(measurement) 
    for val in ([Measurement_1], [Measurement_2], 
       [Measurement_3], [Measurement_4]) 
) p 

는 참조 SQL Fiddle With Demo

,

두 쿼리는 동일한 결과를 생성합니다 :

여기 내 자신의 블로그를 참조하지만, 될
MEASURE_ID | MEASUREMENT_1 | MEASUREMENT_2 | MEASUREMENT_3 | MEASUREMENT_4 
========================================================================== 
1   | 2.3   | 3.3   | 3.4   | (null) 
2   | 2.3   | 3    | 4    | 4.5 
+0

멋진 bluefeet. 맹세코, stackoverflow를 거의 가지고 있으면 그렇게 생각할 필요가 없습니다 .--) 이것이 효과가 있다고 생각합니다. –