【发布时间】:2013-07-29 20:23:50
【问题描述】:
我知道这听起来很疯狂,可能不应该这样做,但我需要这样的东西 - 我有来自 SELECT [Type], [Total Sales] From Before 的记录
我想在末尾添加一个额外的行以在表的末尾(之后)显示 SUM。这个可以吗?
【问题讨论】:
-
Sql Server 支持小计:see with rollup.
标签: sql sql-server rollup
我知道这听起来很疯狂,可能不应该这样做,但我需要这样的东西 - 我有来自 SELECT [Type], [Total Sales] From Before 的记录
我想在末尾添加一个额外的行以在表的末尾(之后)显示 SUM。这个可以吗?
【问题讨论】:
标签: sql sql-server rollup
您的问题需要更多细节,但说“类型”来自名为 letters 的表,而“sales”来自名为 transactions 的表。您可以使用 UNION ALL。
SELECT 类型,COUNT(sales)“总销售额” 来自字母 按类型分组 联合所有 SELECT 'Total', COUNT(sales) "总销售额" 来自交易
【讨论】:
这是您希望在 SQL Server 2008+ 中使用的更强大的分组/汇总语法。指定您正在使用的版本总是有用的,因此我们不必猜测。
SELECT
[Type] = COALESCE([Type], 'Total'),
[Total Sales] = SUM([Total Sales])
FROM dbo.Before
GROUP BY GROUPING SETS(([Type]),());
克雷格·弗里德曼写信给a great blog post introducing GROUPING SETS。
【讨论】:
如果您想在没有聚合函数的情况下显示更多列值,请使用 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 [Type], [Total Sales] From Before
union all
SELECT 'Total', Sum([Total Sales]) From Before
如果您在订购时遇到问题,请按照 i-one 的建议试试这个:
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 [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
如果您使用的是 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)
;
【讨论】:
您可以使用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
【讨论】: