2

2 つの列 (HardwarePhase と HardwarePhase_Result) に基づく二重の動的ピボットに取り組んでいます。

下の画像の最初の結果セットを使用すると、私が持っている生データになります。5 つの項目の各セット (画像で強調表示) は、HardwareTestCaseID に基づいてグループ化されます。

画像の 2 番目の結果セットは、このクエリの作成方法から取得した現在の結果です。 理想的には、2 番目の列の結果は同じ結果になりますが、代わりに結果をグループ化します。

グループ化は HardwareTestCaseID に基づいているはずですが、これは行われていません。

現在の結果

私が実際に望んでいる結果がここに示されています。(複数の行があるはずですが、これは 5 つのエントリごとにグループ化する方法です)。

理想的な結果

これは私が現在使用しているクエリです:

注: @col 変数は、HardwarePhases (P0、M1、M2、M3) のリストに基づいて作成されます。

select @query = 'SELECT ' + @colsNames + ',' +  @colsResultNames + ', HardwareTestCaseID FROM 
            (
                SELECT HardwarePhase_Result, HardwarePhase, ResultValue, HardwareTestCaseID, HardwareStatus
                FROM #temp4
            ) as x
            pivot 
            (
                 MAX(ResultValue)
                FOR HardwarePhase_Result IN (' + @colsResult + ')
            ) as p 
            pivot 
            (
                 MAX(HardwareStatus)
                FOR HardwarePhase IN (' + @cols + ')
            ) as p2 ';

このテーブルを使用して:

create table #temp4
(
    HardwarePhase nvarchar(max),
    HardwarePhase_Result nvarchar(max),
    ResultValue bigint,
    HardwareTestCaseID bigint,
    HardwareStatus nvarchar(max),
    Block nvarchar(max)
);
4

2 に答える 2

1
--This is Just AWESOME. Simplified it for just one table as it's a much more common case (and could not find anything even close to this elegant after trying for hours)

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

select @cols = STUFF((SELECT ',' + QUOTENAME(your_key_column) 
                    from YOUR_ORIGINAL_KEY_AND_VALUE_TABLE
                    group by your_key_column
                    FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT your_row_heading_columns,' + @cols + '
            INTO YOUR_NEW_PIVOTED_TABLE
            from 
            (
              select your_row_heading_columns,your_key_column,your_value_column
              from YOUR_ORIGINAL_KEY_AND_VALUE_TABLE
            ) x
            pivot 
            (
                max(your_value_column)
                for your_key_column in (' + @cols + ')
            ) p '

execute sp_executesql @query;
于 2020-12-12T15:02:20.367 に答える