2013-10-30 2 views
4

누군가 mssql에서 다음을 변환하도록 도와 줄 수 있습니까?MSSQL 동적 피벗 열 값을 열 머리글

ID | PROPERTY_NAME | PROPERTY_VALUE 
1 |  name1  |  value 
1 |  name2  |  value 
1 |  name3  |  value 
2 |  name4  |  value 
2 |  name2  |  value 
3 |  name6  |  value 
.. 

PROPERTY_NAME & PROPERTY_VALUE되는 헤더, ID를 가진 다수의 '속성'

내가로 변환하려면 :

ID | NAME1 | NAME2 | NAME3 | NAME4 | NAME5 | NAME6 | nameETC... 
1 | value | value | value |  |  |  | valueETC... 
2 |   | value |  | value |  |  | valueETC... 
3 |   |  |  |  |  | value | valueETC... 
.. 

NAME1 | NAME2 | NAME3 등은 이제 열 머리글입니다.

저는 피벗과 'MycoolTable에서 고유 PROPERTY_NAME 선택'을 추측하고 있지만이 둘을 함께 묶을 수는 없습니다.

내가 가진 이것은까지입니다 (더 SERVER_ID) 열 사방 모든 널는) 분명히 내가 바보 해요 : D

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

select @cols = STUFF((SELECT distinct 
      ',' + QUOTENAME(PROPERTY_NAME) 
       FROM [BSARA_DW_DB].[dbo].[SERVER_PROPERTY] 
       FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
       ,1,1,''); 

SET @query = 'SELECT '+ @cols + ' from 
     (
      SELECT SERVER_ID, PROPERTY_NAME, PROPERTY_CHAR_VAL 
      FROM [BSARA_DW_DB].[dbo].[SERVER_PROPERTY] 
     ) x 
     pivot 
     (
      MAX(SERVER_ID) 
      for PROPERTY_CHAR_VAL in (' + @cols + ') 
     ) p '; 

execute(@query) 

많은 감사, 마이크

+2

지금까지 해보신 것은 무엇입니까? 당신은 SQL 피들 http://sqlfiddle.com에서 무언가를 만들 수 있습니까? 그리고 당신은 피벗을 언급 해 봤습니다 : http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx – Kairan

+0

내가 뭘 시도했는지 편집했습니다. – Salakar

답변

5

현재의 문제 쿼리는 라인이다 :

MAX(SERVER_ID) 

당신은 대신 각 PROPERTY_NAME에 대한 PROPERTY_CHAR_VAL을 표시합니다. SERVER_ID은 컬럼으로 최종 결과의 일부가됩니다.

당신이 PIVOT 작업 할 때 때때로 유사한 하드 코딩 된 값으로 먼저 코드를 작성하는 것이 더 쉽습니다 :

select id, name1, name2, name3, name4 
from 
(
    select id, property_name, property_value 
    from yourtable 
) d 
pivot 
(
    max(property_value) 
    for property_name in (name1, name2, name3, name4) 
) piv; 

SQL Fiddle with Demo를 참조하십시오.

올바른 논리가있는 버전을 얻은 다음 동적 SQL로 변환하여 결과를 얻을 수 있습니다. 이렇게하면 실행될 SQL 문자열이 생성되고 모든 새 열 이름이 포함됩니다.

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(PROPERTY_NAME) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT id, ' + @cols + ' 
      from 
      (
       select id, property_name, property_value 
       from yourtable 
      ) x 
      pivot 
      (
       max(property_value) 
       for property_name in (' + @cols + ') 
      ) p ' 

execute sp_executesql @query; 

SQL Fiddle with Demo을 참조하십시오. 둘 다 결과를 알려줍니다.

| ID | NAME1 | NAME2 | NAME3 | NAME4 | NAME6 | 
|----|--------|--------|--------|--------|--------| 
| 1 | value | value | value | (null) | (null) | 
| 2 | (null) | value | (null) | value | (null) | 
| 3 | (null) | (null) | (null) | (null) | value | 
+0

당신은 최고입니다 : @) 나는 가까운 녀석이었습니다. (첫 번째 수정 된 게시물 참조) - 고마워요. – Salakar

+1

@ user2938161 당신은 질문에 매우 가까웠습니다. 그래서 하드 코딩이 때때로 더 쉽습니다. :) – Taryn