2017-01-05 4 views
-1

複数の行をグループに基づいて単一の行に変換する必要があります。複数の行をSQL​​ Serverの1つのカスタマイズされた行に変換したい

私はサンプルのスクリーンショット添付しました:列名が固定されていない場合は

enter image description here

+2

あなたはすでに試したことを教えてください。 – kodabear

+0

ピボットのコンセプトを試しました。 – user2814814

+0

あなたの質問文をここに追加してください画像がありません... – Darshak

答えて

1

ノーランの答えしかし、あなたがする必要があるのは、固定数の行をstatに変換することだけです列のicのセットは、なぜそれを簡単に保つのですか?

;WITH cteYourData 
    (
    ColumnName, 
    Value, 
    NewValue, 
    NV_Decode, 
    OldValue, 
    OV_Decode 
    ) 
    AS 
    (
    SELECT 'HearingDetailsId', 379785, 379785, NULL, NULL, NULL 
    UNION ALL SELECT 'Informal', 379785, 5641, 'karthick.devaraj', 863, 'Prabhu' 
    UNION ALL SELECT 'Formal', 379785, 5641, '5641', NULL, NULL 
    ) 
    SELECT * 
     INTO #YourData 
     FROM cteYourData; 

SELECT HearingDetailsId = hd.Value, 
    [Informal NewValue] = inf.NewValue, 
    [Informal NV_Decode] = inf.NV_Decode, 
    [Informal OldValue] = inf.OldValue, 
    [Informal OV_Decode] = inf.OV_Decode, 
    [Formal NewValue] = frm.NewValue, 
    [Formal NV_Decode] = frm.NV_Decode, 
    [Formal OldValue] = frm.OldValue, 
    [Formal OV_Decode] = frm.OV_Decode 
    FROM #YourData AS hd 
     LEFT OUTER JOIN #YourData AS inf 
      ON hd.Value = inf.Value 
      AND inf.ColumnName = 'Informal' 
     LEFT OUTER JOIN #YourData AS frm 
      ON hd.Value = frm.Value 
      AND frm.ColumnName = 'Formal' 
    WHERE hd.ColumnName = 'HearingDetailsId' 
0
CREATE TABLE #tt(ColumnName varchar(100),[value] int,NewValue int,NV_Decode varchar(100),OldVaue int,OV_Decode varchar(100)) 
INSERT INTO #tt 
VALUES('HearingDetailsid',3797685,3797685,NULL,NULL,NULL) 
,('Informal',3797685,5641,'karthick. devaral',863,'Prabhu') 
,('Formal',3797685,5641,'5641',null,null) 

SELECT * FROM (
     SELECT [value] AS [HearingDetailsid], c.col_title,c.col_value FROM #tt AS t 
     CROSS APPLY(VALUES (ColumnName+'NewValue',CONVERT(VARCHAR,NewValue)),(ColumnName+'NV_Decode',CONVERT(VARCHAR,NV_Decode)) 
         ,(ColumnName+'OldVaue',CONVERT(VARCHAR,OldVaue)),(ColumnName+'OV_Decode',CONVERT(VARCHAR,OV_Decode)) 
     ) c(col_title,col_value) 
     WHERE t.ColumnName!='HearingDetailsid' 
) AS t 
PIVOT(MAX(t.col_value) FOR t.col_title IN (InformalNewValue,InformalNV_Decode,InformalOldVaue,InformalOV_Decode,FormalNewValue 
,FormalNV_Decode,FormalOldVaue,FormalOV_Decode)) p 

を、あなたは動的なスクリプトを使用することができます。

DECLARE @col VARCHAR(max),@sql VARCHAR(max) 
    SELECT @col=ISNULL(@col+',','')+ t.ColumnName+'NewValue,'+t.ColumnName+'NV_Decode,' + t.ColumnName+'OldVaue,'+t.ColumnName+'OV_Decode' 
    FROM #tt AS t WHERE t.value!=t.NewValue 
    --PRINT @col 

    SET @sql='SELECT * FROM (
       SELECT [value] AS [HearingDetailsid], c.col_title,c.col_value FROM #tt AS t 
       CROSS APPLY(VALUES (ColumnName+''NewValue'',CONVERT(VARCHAR,NewValue)),(ColumnName+''NV_Decode'',CONVERT(VARCHAR,NV_Decode)) 
           ,(ColumnName+''OldVaue'',CONVERT(VARCHAR,OldVaue)),(ColumnName+''OV_Decode'',CONVERT(VARCHAR,OV_Decode)) 
       ) c(col_title,col_value) 
       WHERE t.value!=t.NewValue 
     ) AS t 
     PIVOT(MAX(t.col_value) FOR t.col_title IN ('[email protected]+')) p' 
    EXEC(@sql) 
 
HearingDetailsid InformalNewValue    InformalNV_Decode    InformalOldVaue    InformalOV_Decode    FormalNewValue     FormalNV_Decode    FormalOldVaue     FormalOV_Decode 
---------------- ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ 
3797685   5641       karthick. devaral    863       Prabhu       5641       5641       NULL       NULL 


+0

ありがとう、Nolan Shang。あなたは私の時間を救った – user2814814

関連する問題