我知道这听起来很疯狂,可能不应该这样做,但我需要这样的东西 - 我有来自的记录SELECT [Type], [Total Sales] From Before
我想在末尾添加一个额外的行以在表的末尾(之后)显示 SUM。这可以做到吗?
我知道这听起来很疯狂,可能不应该这样做,但我需要这样的东西 - 我有来自的记录SELECT [Type], [Total Sales] From Before
我想在末尾添加一个额外的行以在表的末尾(之后)显示 SUM。这可以做到吗?
如果您使用的是 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
如果您在订购时遇到问题,请按照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
您可以使用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 type, COUNT(sales) "total sales" FROM letters GROUP BY type UNION ALL SELECT 'Total', COUNT(sales) "total sales" FROM transactions