[英]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.