我知道这听起来很疯狂,可能不应该这样做,但我需要这样的事情 - 我有来自SELECT [Type], [Total Sales] From Before
的记录
我想在末尾添加一个额外的行,以在表的末尾显示SUM(After)。这可以吗?
答案 0 :(得分:47)
如果您使用的是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)
;
答案 1 :(得分:18)
这是您希望在SQL Server 2008+中使用的更强大的分组/汇总语法。指定您正在使用的版本总是很有用,所以我们不必猜测。
SELECT
[Type] = COALESCE([Type], 'Total'),
[Total Sales] = SUM([Total Sales])
FROM dbo.Before
GROUP BY GROUPING SETS(([Type]),());
Craig Freedman写了a great blog post introducing GROUPING SETS
。
答案 2 :(得分:15)
尝试使用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
答案 3 :(得分:12)
您可以使用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
答案 4 :(得分:0)
如果要显示更多没有聚合功能的列值,请使用ALT + ENTER
而不是GROUPING SETS
:
ROLLUP