Sql server SQL Server 2012中包含列和行总计的动态透视表

Sql server SQL Server 2012中包含列和行总计的动态透视表,sql-server,Sql Server,我有RPT_DailySalesSummary表,其中包含CalDate、OrderID、SalesAmount和LorecID列 CalDate OrderID SalesAmount LocRecID 2016-12-01 R101 100 81 2016-12-01 R102 120 81 2016-12-01 R113 150 82 2016-12-01 R104 130 85 201

我有RPT_DailySalesSummary表,其中包含CalDate、OrderID、SalesAmount和LorecID列

CalDate OrderID SalesAmount LocRecID 2016-12-01 R101 100 81 2016-12-01 R102 120 81 2016-12-01 R113 150 82 2016-12-01 R104 130 85 2016-12-02 R205 250 81 2016-12-02 R106 104 82 2016-12-02 R112 80 85 2016-12-02 R032 80 85 我觉得很难理解如何使用PIVOT。我不知道如何继续代码来创建我的预期结果

有人能帮忙吗?非常感谢。

像这样试试

根据您的问题:

CREATE TABLE #RPT_DailySalesSummary (
    CalDate DATE
    ,OrderID VARCHAR(10)
    ,SalesAmount INT
    ,LocRecID INT
    )

INSERT INTO #RPT_DailySalesSummary
SELECT '2016-12-01', 'R101',    100,          81
UNION ALL
SELECT '2016-12-01', 'R102',    120,          81
UNION ALL
SELECT '2016-12-01', 'R113',    150,          82
UNION ALL
SELECT '2016-12-01', 'R104',    130 ,         85
UNION ALL
SELECT '2016-12-02', 'R205',    250 ,         81
UNION ALL
SELECT '2016-12-02', 'R106',    104,          82
UNION ALL
SELECT '2016-12-02', 'R112',    80 ,          85
UNION ALL
SELECT '2016-12-02', 'R032',    80 ,          85
你们需要准备列的总和,就像你们准备的列列表一样

DECLARE @cols       NVARCHAR(MAX)=''
DECLARE @query      NVARCHAR(MAX)=''
DECLARE @COLS_SUM   NVARCHAR(MAX)=''
DECLARE @COLS_TOT   NVARCHAR(MAX)=''

--Preparing columns for Pivot
SELECT @cols = @cols + QUOTENAME(LocRecID) + ',' 
FROM (SELECT DISTINCT LocRecID FROM #RPT_DailySalesSummary ) AS tmp
SELECT @cols = SUBSTRING(@cols, 0, LEN(@cols))

--Preparing sum of columns for Totals Horizontal
SELECT @COLS_SUM = @COLS_SUM + QUOTENAME(LocRecID) + '+' 
FROM (SELECT DISTINCT LocRecID FROM #RPT_DailySalesSummary ) AS tmp
SELECT @COLS_SUM = ','+ SUBSTRING(@COLS_SUM, 0, LEN(@COLS_SUM)) +' AS TOTAL'

--Preparing sum of individual columns for Totals Vertically
SELECT @COLS_TOT = @COLS_TOT +'SUM('+ QUOTENAME(LocRecID) + '),' 
FROM (SELECT DISTINCT LocRecID FROM #RPT_DailySalesSummary ) AS tmp
SELECT @COLS_TOT = SUBSTRING(@COLS_TOT, 0, LEN(@COLS_TOT)) 



SET @query = 
            'SELECT *'+@COLS_SUM+'  INTO #TAB FROM 
            (
                    SELECT CalDate, SalesAmount, LocRecID 
                    FROM #RPT_DailySalesSummary
            ) src
            PIVOT 
            (
                    SUM(SalesAmount) FOR LocRecID IN (' + @cols + ')
            ) piv

            SELECT * FROM #TAB
            UNION ALL
            SELECT NULL AS TOTAL ,'+@COLS_TOT+',SUM(TOTAL) FROM #TAB

            '

execute(@query)
结果将是

╔════════════╦═════╦═════╦═════╦═══════╗
║  CalDate   ║ 81  ║ 82  ║ 85  ║ TOTAL ║
╠════════════╬═════╬═════╬═════╬═══════╣
║ 2016-12-01 ║ 220 ║ 150 ║ 130 ║   500 ║
║ 2016-12-02 ║ 250 ║ 104 ║ 160 ║   514 ║
║ NULL       ║ 470 ║ 254 ║ 290 ║  1014 ║
╚════════════╩═════╩═════╩═════╩═══════╝

非常感谢你。我看到T-SQL的GROUP BY ROLLUP函数似乎也在做同样的事情,可以应用到我的案例中吗?删除最后的union all并将ROLLUP应用到第一个select
DECLARE @cols       NVARCHAR(MAX)=''
DECLARE @query      NVARCHAR(MAX)=''
DECLARE @COLS_SUM   NVARCHAR(MAX)=''
DECLARE @COLS_TOT   NVARCHAR(MAX)=''

--Preparing columns for Pivot
SELECT @cols = @cols + QUOTENAME(LocRecID) + ',' 
FROM (SELECT DISTINCT LocRecID FROM #RPT_DailySalesSummary ) AS tmp
SELECT @cols = SUBSTRING(@cols, 0, LEN(@cols))

--Preparing sum of columns for Totals Horizontal
SELECT @COLS_SUM = @COLS_SUM + QUOTENAME(LocRecID) + '+' 
FROM (SELECT DISTINCT LocRecID FROM #RPT_DailySalesSummary ) AS tmp
SELECT @COLS_SUM = ','+ SUBSTRING(@COLS_SUM, 0, LEN(@COLS_SUM)) +' AS TOTAL'

--Preparing sum of individual columns for Totals Vertically
SELECT @COLS_TOT = @COLS_TOT +'SUM('+ QUOTENAME(LocRecID) + '),' 
FROM (SELECT DISTINCT LocRecID FROM #RPT_DailySalesSummary ) AS tmp
SELECT @COLS_TOT = SUBSTRING(@COLS_TOT, 0, LEN(@COLS_TOT)) 



SET @query = 
            'SELECT *'+@COLS_SUM+'  INTO #TAB FROM 
            (
                    SELECT CalDate, SalesAmount, LocRecID 
                    FROM #RPT_DailySalesSummary
            ) src
            PIVOT 
            (
                    SUM(SalesAmount) FOR LocRecID IN (' + @cols + ')
            ) piv

            SELECT * FROM #TAB
            UNION ALL
            SELECT NULL AS TOTAL ,'+@COLS_TOT+',SUM(TOTAL) FROM #TAB

            '

execute(@query)
╔════════════╦═════╦═════╦═════╦═══════╗
║  CalDate   ║ 81  ║ 82  ║ 85  ║ TOTAL ║
╠════════════╬═════╬═════╬═════╬═══════╣
║ 2016-12-01 ║ 220 ║ 150 ║ 130 ║   500 ║
║ 2016-12-02 ║ 250 ║ 104 ║ 160 ║   514 ║
║ NULL       ║ 470 ║ 254 ║ 290 ║  1014 ║
╚════════════╩═════╩═════╩═════╩═══════╝