繁体   English   中英

添加带有总计的汇总行

[英]Add a summary row with totals

我知道这听起来很疯狂,可能不应该这样做,但我需要这样的东西 - 我有一个来自SELECT [Type], [Total Sales] From Before

我想在末尾添加一个额外的行以显示表末尾的 SUM (After)。 这能做到吗?

在此处输入图片说明

如果您使用的是 SQL Server 2008 或更高版本,则可以使用ROLLUP() GROUP BY 函数:

SELECT
  Type = ISNULL(Type, 'Total'),
  TotalSales = SUM(TotalSales)
FROM atable
GROUP BY ROLLUP(Type)
;

这假设Type列不能有 NULL,因此此查询中的 NULL 将指示汇总行,即具有总计的行。 但是,如果Type列可以有自己的 NULL,则更合适的总行会计类型将类似于@Declan_K 的答案,即使用GROUPING()函数:

SELECT
  Type = CASE GROUPING(Type) WHEN 1 THEN 'Total' ELSE Type END,
  TotalSales = SUM(TotalSales)
FROM atable
GROUP BY ROLLUP(Type)
;

这是您希望在 SQL Server 2008+ 中使用的更强大的分组/汇总语法。 指定您使用的版本总是有用的,所以我们不必猜测。

SELECT 
  [Type] = COALESCE([Type], 'Total'), 
  [Total Sales] = SUM([Total Sales])
FROM dbo.Before
GROUP BY GROUPING SETS(([Type]),());

Craig Freedman 写了一篇介绍GROUPING SETS的精彩博客文章

尝试使用union all如下

SELECT [Type], [Total Sales] From Before
union all
SELECT 'Total', Sum([Total Sales]) From Before

如果您在订购时遇到问题,正如我所建议的那样:

select [Type], [Total Sales] 
from (SELECT [Type], [Total Sales], 0 [Key] 
      From Before 
      union all 
      SELECT 'Total', Sum([Total Sales]), 1 From Before) sq 
order by [Key], Type

您可以使用ROLLUP运算符

SELECT  CASE 
            WHEN (GROUPING([Type]) = 1) THEN 'Total'
            ELSE [Type] END AS [TYPE]
        ,SUM([Total Sales]) as Total_Sales
From    Before
GROUP BY
        [Type] WITH ROLLUP

如果要在没有聚合函数的情况下显示更多列值,请使用GROUPING SETS而不是ROLLUP

SELECT
  Type = ISNULL(Type, 'Total'),
  SomeIntColumn = ISNULL(SomeIntColumn, 0),
  TotalSales = SUM(TotalSales)
FROM atable
GROUP BY GROUPING SETS ((Type, SomeIntColumn ), ())
ORDER BY SomeIntColumn --Displays summary row as the first row in query result

您的问题需要更多细节,但要说“类型”来自称为字母的表,而“销售”来自称为交易的表。 您可以使用 UNION ALL。

SELECT 类型, COUNT(sales) “总销售额” FROM 字母 GROUP BY 类型 UNION ALL SELECT 'Total', COUNT(sales) “总销售额” FROM 交易

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM