添加包含汇总的汇总行

我知道这听起来很疯狂,也许不应该这样做,但我需要这样的东西-我从 SELECT [Type], [Total Sales] From Before的记录

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

enter image description here

214567 次浏览

试着像下面这样使用 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

您可以使用 总结操作符

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

这是您希望在 SQLServer2008 + 中使用的更强大的分组/汇总语法。指定您正在使用的版本总是很有用,这样我们就不必猜测了。

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

克雷格 · 弗里德曼写了 一篇介绍 GROUPING SETS的博客文章

如果使用的是 SQLServer2008或更高版本,则可以使用 ROLLUP()GROUPBY 函数:

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)
;

如果希望显示更多的列值而不使用聚合函数,请使用 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。

选择类型,计数(销售额)“总销售额” 来自信件 按类型分组 工会 选择“总销售额”,计算(销售额)“总销售额” 交易记录