2017-10-30 4 views
1

次の出力のためにSQLクエリ/ spを作成するには、あなたの助けが必要です。私は、次のような出力を生成したい新しい列ごとに列値を繰り返して複数の列をピボットする

enter image description here

私のテーブルには、次のデータである

enter image description here

親切に注意し、ここで、フィールド名はわずか4ではありません表のように、それは変化する。

データの下に検索:

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 + ' ... 
    
関連する問題