Adding Grand Totals in Pivot Table

孤者浪人 提交于 2019-12-08 08:42:27

You should be able to add a GROUP BY with ROLLUP to produce the totals row, similar to this:

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

SELECT @Columns =
COALESCE(@Columns + ', ','')+ QUOTENAME(PortfolioID)
FROM
(
    SELECT distinct PortfolioID 
    FROM worktable
) AS B
ORDER BY B.PortfolioID

SELECT @ColumnsRollup =
COALESCE(@ColumnsRollup + ', Sum(','Sum(')+ QUOTENAME(cast(PortfolioID as varchar(10)))+') as Portfolio'+cast(PortfolioID as varchar(10))
FROM
(
    SELECT distinct PortfolioID 
    FROM worktable
) AS B
ORDER BY B.PortfolioID

SET @SQL = '
            WITH PivotData AS
            (
                SELECT PortfolioID, Percentage, DurationBand, DurationSort 
                FROM Worktable
            )
            SELECT case when DurationBand is not null then cast(durationband as varchar(10))
                else ''Total'' end Durationband, ' + @ColumnsRollup+ '
            FROM
            (
                SELECT DurationBand, ' + @Columns + '
                FROM PivotData
                PIVOT
                (
                    SUM(Percentage)
                    FOR PortfolioID IN (' + @Columns + ')
                ) AS PivotResult
            ) src
            GROUP BY DurationBand with ROLLUP'

EXEC (@SQL)

See SQL Fiddle with Demo. Note: sample data is just mocked based on your table structure.

Result:

| DURATIONBAND | PORTFOLIO1 | PORTFOLIO2 | PORTFOLIO3 |
-------------------------------------------------------
|            2 |         78 |     (null) |     (null) |
|            5 |     (null) |     (null) |          4 |
|           12 |         10 |         45 |     (null) |
|        Total |         88 |         45 |          4 |

Based in the need to keep things sorted, you can use:

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

SELECT @Columns =
COALESCE(@Columns + ', ','')+ QUOTENAME(PortfolioID)
FROM
(
    SELECT distinct PortfolioID 
    FROM worktable
) AS B
ORDER BY B.PortfolioID

SELECT @ColumnsRollup =
COALESCE(@ColumnsRollup + ', Sum(','Sum(')+ QUOTENAME(cast(PortfolioID as varchar(10)))+') as '+QUOTENAME(cast(PortfolioID as varchar(10)))
FROM
(
    SELECT distinct PortfolioID 
    FROM worktable
) AS B
ORDER BY B.PortfolioID

SET @SQL = '
            WITH PivotData AS
            (
                SELECT PortfolioID, Percentage, DurationBand, DurationSort 
                FROM Worktable
            )
            SELECT *
            FROM
            (
                SELECT DurationBand, ' + @Columns + '
                FROM PivotData
                PIVOT
                (
                    SUM(Percentage)
                    FOR PortfolioID IN (' + @Columns + ')
                ) AS PivotResult
                UNION ALL
                select ''Grand Total'', '+@ColumnsRollup+'
                from
                (
                    SELECT DurationBand, ' + @Columns + '
                    FROM PivotData
                    PIVOT
                    (
                        SUM(Percentage)
                        FOR PortfolioID IN (' + @Columns + ')
                    ) AS PivotResult
                )tot
            ) src
            '

EXEC (@SQL)

See SQL Fiddle with Demo

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!