微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将总计列添加到动态 SQL 数据透视表

如何解决将总计列添加到动态 SQL 数据透视表

有很多此类问题,但找不到与我要查找的内容相符的任何内容

我正在使用另一篇文章中的代码效果很好,但我想修改它以在表格底部添加一个总计行。

上一篇让创作者获得赞誉的帖子是:SQL Server dynamic pivot with multiple columns

我当前的表格如下:

工作组 平均 01/01/2021 01/01/2021 01/01/2021 等等...
蓝色 5 2 5 8
绿色 5 2 5 8

目标:

工作组 平均 01/01/2021 01/01/2021 01/01/2021 等等...
蓝色 5 2 5 8
绿色 5 2 5 8
总计 10 4 10 16

当前代码是:

DECLARE @colsEAST AS NVARCHAR(MAX);
DECLARE @pivotCountEAST AS NVARCHAR(MAX);
DECLARE @sqlEAST AS NVARCHAR(MAX);

SELECT @colsEAST = ISNULL(@colsEAST + ',','') + QUOTENAME(Load_Date)
FROM (SELECT disTINCT Load_Date FROM ##CE_tmpEast_ALL) AS Load_Date

SET @pivotCountEAST = N'SELECT Work_Group,' + @colsEAST +'
FROM (SELECT Work_Group,Load_Date,Count FROM ##CEtmp_East_ALL) AS Count
PIVOT(SUM(Count) FOR Load_Date IN (' + @colsEAST + ')) AS pvt';

SET @sqlEAST = '; WITH MTD_CountPivot AS (
'+@pivotCountEAST+'
),MTD_Pivot_Tables AS (
  SELECT Work_Group,AVG(Count) AS [AVG Count]
  FROM ##CEtmp_East_ALL
  GROUP BY Work_Group
)
SELECT MTD_CountPivot.Work_Group,MTD_Pivot_Tables.[AVG Count],' + @colsEAST + '
FROM
MTD_CountPivot

INNER JOIN MTD_Pivot_Tables ON MTD_CountPivot.Work_Group = MTD_Pivot_Tables.Work_Group';

EXEC sp_executesql @sqlEAST;

任何帮助将不胜感激!!!

谢谢

解决方法

您可以将 GROUPING SETS ((mcp.Work_Group),()) 添加到当前查询以获取小计。为此,需要创建另一个参数 @colsEAST2 以将生成的列标题日期列表保存为

SUM([2001-01-01]) AS [2001-01-01],SUM([2001-01-02]) AS [2001-01-02],SUM([2001-01-03]) AS [2001-01-03]

连同持有的 @colsEAST

[2001-01-01],[2001-01-02],[2001-01-03]

DECLARE @colsEAST       AS NVARCHAR(MAX);
DECLARE @colsEAST2      AS NVARCHAR(MAX);
DECLARE @pivotCountEAST AS NVARCHAR(MAX);
DECLARE @sqlEAST        AS NVARCHAR(MAX);

SELECT @colsEAST = ISNULL(@colsEAST + ',','') + QUOTENAME(Load_Date)
  FROM (SELECT DISTINCT Load_Date 
          FROM ##CE_tmpEast_ALL) AS Load_Date;    
SELECT @colsEAST2 = ISNULL(@colsEAST2 + ','') 
                + ' SUM('+QUOTENAME(Load_Date)+') AS '+QUOTENAME(Load_Date)
  FROM (SELECT DISTINCT Load_Date 
          FROM ##CE_tmpEast_ALL) AS Load_Date;    
SET @pivotCountEAST = N'SELECT Work_Group,' + @colsEAST2 +'
                          FROM (SELECT Work_Group,Load_Date,Count 
                                  FROM ##CE_tmpEast_ALL) AS Count
                         PIVOT(SUM(Count) FOR Load_Date IN (' + @colsEAST + ')) AS pvt
                         GROUP BY Work_Group';                             
SET @sqlEAST = '; WITH MTD_CountPivot AS (
'+@pivotCountEAST+'
),MTD_Pivot_Tables AS (
  SELECT Work_Group,AVG(Count) AS [AVG Count]
    FROM ##CE_tmpEast_ALL
   GROUP BY Work_Group
)
SELECT CASE WHEN GROUPING(mcp.Work_Group) = 0 
            THEN mcp.Work_Group 
            ELSE ''TOTAL'' 
             END AS Work_Group,SUM(mpt.[AVG Count]) AS Avg,' + @colsEAST2+ '
  FROM MTD_CountPivot mcp
  JOIN MTD_Pivot_Tables mpt 
    ON mcp.Work_Group = mpt.Work_Group
 GROUP BY GROUPING SETS ((mcp.Work_Group),())';    
EXEC sp_executesql @sqlEAST;

Demo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?