Sql server SQL Server 2012中包含列和行总计的动态透视表
我有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。我不知道如何继续代码来创建我的预期结果 有人能帮忙吗?非常感谢。像这样试试 根据您的问题: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
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 ║
╚════════════╩═════╩═════╩═════╩═══════╝