1

ピボット クエリが重複した行を生成しています。誰でもこれを解決できますか?

DECLARE @SQL AS VARCHAR(MAX)
DECLARE @Columns AS VARCHAR (MAX)
DECLARE @ColumnsRollup AS VARCHAR (MAX)

SELECT @Columns =
COALESCE(@Columns + ', ','')+ QUOTENAME(ProjectId)
FROM
(
    SELECT distinct ProjectId 
    FROM tblCPS where MWM=0
) AS B
ORDER BY B.ProjectId

SELECT @ColumnsRollup =
COALESCE(@ColumnsRollup + ', Sum(','Sum(')+ QUOTENAME(cast(ProjectId as varchar(10)))+') as Project'+cast(ProjectId as varchar(10))
FROM
(
    SELECT distinct ProjectId 
    FROM tblCPS where MWM=0
) AS B
ORDER BY B.ProjectId

SET @SQL = '
            WITH PivotData AS
            (
               SELECT  ContractorId, ProjectId, Amount,SUM(Amount) OVER (PARTITION BY ContractorId )/2 as ''Total''
                FROM tblCps 
            )
            SELECT case when ContractorId is not null then cast(ContractorId as varchar(10))
                else ''Totals'' end ContractorId, ' + @ColumnsRollup+ ',Total
            FROM
            (
                SELECT ContractorId, ' + @Columns + ',Total
                FROM PivotData
                PIVOT
                (
                    SUM(Amount)
                    FOR ProjectId IN (' + @Columns + ')
                ) AS PivotResult
            ) src 
            GROUP BY ContractorId,Total with rollup'

EXEC (@SQL)

ここに私が得ている結果があります

1   10.25   20.35   NULL    NULL    NULL    NULL    NULL    NULL    NULL    30.60
1   10.25   20.35   NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
10  NULL    NULL    NULL    NULL    NULL    NULL    303.15  313.25  323.35  939.75
10  NULL    NULL    NULL    NULL    NULL    NULL    303.15  313.25  323.35  NULL
2   40.55   NULL    30.45   50.65   NULL    NULL    NULL    NULL    NULL    121.65
2   40.55   NULL    30.45   50.65   NULL    NULL    NULL    NULL    NULL    NULL
3   70.85   60.75   NULL    NULL    172.00  NULL    NULL    NULL    NULL    303.60
3   70.85   60.75   NULL    NULL    172.00  NULL    NULL    NULL    NULL    NULL
4   101.15  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    101.15
4   101.15  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
5   111.25  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    111.25
5   111.25  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
6   394.35  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    394.35
6   394.35  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
7   151.65  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    151.65
7   151.65  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
8   161.75  171.85  181.95  192.05  202.15  212.25  222.35  232.45  242.55  1819.35
8   161.75  171.85  181.95  192.05  202.15  212.25  222.35  232.45  242.55  NULL
9   NULL    252.65  262.75  272.85  NULL    282.95  293.05  NULL    NULL    1364.25
9   NULL    252.65  262.75  272.85  NULL    282.95  293.05  NULL    NULL    NULL
Totals  1041.80 505.60  475.15  515.55  374.15  495.20  818.55  545.70  565.90  NULL
4

1 に答える 1

2

ROLLUP operator選択した列の値の階層の集計を示す結果セットを生成します。GROUP BY 句の右側の列の各値について、ROLLUP 操作は左側の列 (複数可) の値の組み合わせをレポートします。

ここで、ピボットは重複行を生成していませんが、ロールアップ演算子です。重複していると思われる 2 番目の行は、実際には、ContractorId ディメンションで「Total」という値を持つすべての行の小計を報告します。「合計」ディメンションに対して値 null が返され、行によってレポートされる集計に「合計」ディメンションの任意の値を持つ行が含まれることを示します。

次のクエリが機能するはずです。

SET @SQL = '
WITH PivotData AS
(
SELECT  ContractorId, ProjectId, Amount,SUM(Amount) OVER (PARTITION BY ContractorId )/2 as ''Total''
FROM tblCps 
)
SELECT case when ContractorId is not null then cast(ContractorId as varchar(10))
else ''Totals'' end ContractorId, ' + @ColumnsRollup+ ',sum(Total)
FROM
(
SELECT ContractorId, ' + @Columns + ',Total
FROM PivotData
PIVOT
(
SUM(Amount)
FOR ProjectId IN (' + @Columns + ')
) AS PivotResult
) src 
GROUP BY ContractorId with rollup'-- generate a report considering values 
                                  -- for contractor id only and not Total
EXEC (@SQL);

お役に立てれば!!!

于 2013-11-07T07:34:45.487 に答える