【问题标题】:Inserting/Adding Column totals (sum) at the bottom of the table after a PIVOT在 PIVOT 之后在表格底部插入/添加列总计(总和)
【发布时间】:2023-03-22 16:39:01
【问题描述】:

在运行 PIVOT 命令(Crosstab 查询)后,我真的需要您的帮助才能在我的表中添加一个单独的新行。

我的目标是计算每个 [Request Types] 的列总数,并将该列的总和插入到表格底部的新行中。

这对我来说就像火箭科学,超出了我对 SQL 语言/领域的能力和知识。

这是我表中数据的快速截图:

这是运行 TableA 的 CrossTab 查询后从表中捕获的数据的快速屏幕截图

TRANSFORM Count([Division]) AS CountOfDivision
SELECT [Branch], [Division]
FROM TableA
GROUP BY [Branch], [Division]
PIVOT [Request Type]

这是我想要完成的预期结果/预期结果:

【问题讨论】:

  • 不泄露答案,给你个提示:UNION
  • 我完全迷失了,准备把我所有的头发都拔掉。我已经在谷歌上搜索了几个小时来寻找答案。这甚至可以做到吗?你会将 Union 查询放在哪里,它是如何适应的?
  • 是的,可以做到。在此处搜索 UNION 或 Google。它的工作原理是采用两个不同的查询(具有相同的列 important)并将第二个查询放在第一个查询的底部。
  • 一旦 [Request Types] 被转置为行,Union 将如何计算列数?
  • 因为您将在底部合并相同的查询 - 但它将是带有父聚合的子查询...我仅限于使用 SQL Server,而且我编写不同的方法来完成此任务,但使用相同的 UNION 思想......实际上有许多不同的方法可以做到这一点。

标签: sql database ms-access pivot crosstab


【解决方案1】:

正如对原始帖子的评论中所述,我仅限于使用 SQL Server 而不是 MS Access。但是,建议是在 MS Access 查询中使用 UNION 语句 - 此示例仍然提供了回答问题的有效方法。

要在所有单个记录下方创建“总计”行,需要使用相同的 SQL 编写聚合查询(在要“总计”的列中添加聚合函数)。

我在这里使用CASE 语句使逻辑更易于消化,而不会增加交叉表和数据透视表的复杂性。

SELECT   A.Branch
        ,A.Division
        ,CASE WHEN A.RequestType = 'Report' THEN 1 ELSE 0 END AS Report
        ,CASE WHEN A.RequestType = 'Financial Analysis' THEN 1 ELSE 0 END AS FinancialAnalysis
        ,CASE WHEN A.RequestType = 'Letter' THEN 1 ELSE 0 END AS Letter
        ,CASE WHEN A.RequestType = 'Research Paper' THEN 1 ELSE 0 END AS ResearchPaper
  FROM   TableA

UNION

SELECT   'TOTAL'
        ,NULL
        ,SUM(CASE WHEN A.RequestType = 'Report' THEN 1 ELSE 0 END) AS Report
        ,SUM(CASE WHEN A.RequestType = 'Financial Analysis' THEN 1 ELSE 0 END) AS FinancialAnalysis
        ,SUM(CASE WHEN A.RequestType = 'Letter' THEN 1 ELSE 0 END) AS Letter
        ,SUM(CASE WHEN A.RequestType = 'Research Paper' THEN 1 ELSE 0 END) AS ResearchPaper
  FROM   TableA

此查询的结果将如下所示:

Branch  Division    Report  FinancialAnalysis   Letter  ResearchPaper
ASFA    ASFAA       1       0                   0       0
ASFA    ASFAB       1       0                   0       0
ASFA    ASFAD       0       0                   0       1
ASFB    ASFBE       0       0                   1       0
ASFC    ASFCC       0       1                   0       0
TOTAL   NULL        2       1                   1       1

这是通过从第一个查询中获取所有列表列并再次查询它们,但也将它们相加来实现的。这只会产生一行 - 附加到第一个查询。

使用 MS Access 时,我在上面使用的 CASE 语句将不起作用,除非您在 VBA 中编写此逻辑,即使这样语法也不同。 MS 访问中的 SQL 代码将需要使用 SWITCHIIF 函数来代替

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2012-06-20
    • 1970-01-01
    • 2019-01-21
    • 2015-02-23
    相关资源
    最近更新 更多