添加包含总计的摘要行

时间:2013-07-29 21:14:34

标签: sql sql-server rollup

我知道这听起来很疯狂,可能不应该这样做,但我需要这样的事情 - 我有来自SELECT [Type], [Total Sales] From Before的记录

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

enter image description here

5 个答案:

答案 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