2017-10-30 10 views
1

다음 출력을 위해 SQL 쿼리/sp를 작성하는 데 도움이 필요합니다.새로운 열마다 열 값이 반복되는 여러 열 피벗

enter image description here

나는 다음과 같은 출력을 생성하고 싶습니다 :

내 표는 다음과 같은 데이터 함께 친절하게 여기주의

enter image description here

을, 필드 이름은 네 아니다 표에서와 같이 다양합니다. 데이터 아래

찾기 :

CREATE TABLE #Results 
(
    FieldName nvarchar(50), 
    FieldValue nvarchar(50), 
    RecordStaus int 
); 

INSERT INTO #Results(FieldName,FieldValue,RecordStaus) 
VALUES ('Coverage',NULL,1) 
     ,('Premium',NULL,2) 
     ,('F1',100,1) 
     ,('F2',100,1) 
     ,('Coverage',200,1) 
     ,('Premium',10,1) 
     ,('F1',50,1) 
     ,('F2',NULL,3) 
     ,('Coverage',300,1) 
     ,('Premium',45,1) 
     ,('F1',24,1) 
     ,('F2',NULL,1) 
     ,('Coverage',450,3) 
     ,('Premium',12,3) 
     ,('F1',50,1) 
     ,('F2',NULL,1); 
+0

당신은 값이 행을 그룹화하는 열이 있습니까? – gotqn

답변

1

당신이 시도 할 수 있습니다 :

CREATE TABLE #Results 
(
id int identity(1,1), 
FieldName nvarchar(50), 
FieldValue nvarchar(50), 
RecordStaus int 
); 

INSERT INTO #Results(FieldName,FieldValue,RecordStaus) 
VALUES ('Coverage',NULL,1) 
,('Premium',NULL,2) 
,('F1',100,1) 
,('F2',100,1) 
,('Coverage',200,1) 
,('Premium',10,1) 
,('F1',50,1) 
,('F2',NULL,3) 
,('Coverage',300,1) 
,('Premium',45,1) 
,('F1',24,1) 
,('F2',NULL,1) 
,('Coverage',450,3) 
,('Premium',12,3) 
,('F1',50,1) 
,('F2',NULL,1); 


DECLARE @DynamicTSQLStatement NVARCHAR(MAX) 
     ,@Columns NVARCHAR(MAX); 


SELECT @Columns = STUFF 
(
    (

     SELECT * 
     FROM 
     (
      SELECT DISTINCT ',[' + CAST([FieldName] AS NVARCHAR(50)) + ']' 
      FROM #Results 
      UNION 
      SELECT DISTINCT ',[' + CAST([FieldName] + '_RecordStaus' AS NVARCHAR(50)) + ']' 
      FROM #Results 
     ) DS ([FieldName]) 
     FOR XML PATH(''), TYPE 

    ).value('.', 'VARCHAR(MAX)') 
    ,1 
    ,1 
    ,'' 
); 


SET @DynamicTSQLStatement = N' 
SELECT * 
FROM 
(
    SELECT [FieldName] 
      + CASE WHEN [Column] = ''RecordStaus'' THEN ''_RecordStaus'' ELSE '''' END AS [FieldName] 
      ,[rowID] 
      ,[Value] 
    FROM 
    ( 
     SELECT [FieldName] 
       ,[FieldValue] 
       ,CAST([RecordStaus] AS NVARCHAR(50)) 
       ,ROW_NUMBER() OVER (PARTITION BY [FieldName] ORDER BY [id]) 
     FROM #Results 
    ) DS ([FieldName], [FieldValue], [RecordStaus], [rowID]) 
    UNPIVOT 
    (
     [Value] FOR [Column] IN ([FieldValue], [RecordStaus]) 
    ) UNPVT 
) ReadyForPivot 
PIVOT 
(
    MAX([Value]) FOR [FieldName] IN (' + @Columns +') 
) PVT; 
'; 

EXEC sp_executesql @DynamicTSQLStatement; 

DROP TABLE #Results; 

enter image description here

거의 노트 :

  • 내가하기 위해 id 열을 추가 한 알고있다 어떤 행/실제로 다른 경우에 주문을 사용할 수있는 값 또는 ROW_NUMBER 함수의 SELECT 1; 결과가 결정 론적이라는 것을 확신하기 위해서는 이러한 방식이 필요합니다.
  • 다양한 값의 FildName 열에 대해 쿼리가 작동하도록하려면 동적 SQL을 사용하고 있습니다. 열의 순서가 필요한 경우 FOR XML 절에 ORDER BY 절을 사용하면됩니다. 예를 들어 :

    SELECT @Columns = STUFF 
    (
        (
    
         SELECT * 
         FROM 
         (
          SELECT DISTINCT ',[' + CAST([FieldName] AS NVARCHAR(50)) + ']' 
          FROM #Results 
          UNION 
          SELECT DISTINCT ',[' + CAST([FieldName] + '_RecordStaus' AS NVARCHAR(50)) + ']' 
          FROM #Results 
         ) DS ([FieldName]) 
         ORDER BY [FieldName] DESC -- you can order the columns as you like 
         FOR XML PATH(''), TYPE 
    
        ).value('.', 'VARCHAR(MAX)') 
        ,1 
        ,1 
        ,'' 
    ); 
    

    그런 다음 동적 SQL에 @columns 변수 값을 추가

    SET @DynamicTSQLStatement = N' 
    SELECT' + @columns + ' ...