72

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

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

在此处输入图像描述

4

6 回答 6

69

如果您使用的是 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)
;
于 2013-07-29T21:55:15.673 回答
28

这是您希望在 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.

于 2013-07-29T21:49:20.650 回答
20

尝试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
于 2013-07-29T21:15:35.720 回答
14

您可以使用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
于 2013-07-29T21:22:35.093 回答
2

如果您想在没有聚合函数的情况下显示更多列值,请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
于 2019-09-18T06:43:37.327 回答
0

您的问题需要更多细节,但说“类型”来自称为字母的表,而“销售”来自称为事务的表。您可以使用 UNION ALL。

SELECT type, COUNT(sales) "total sales" FROM letters GROUP BY type UNION ALL SELECT 'Total', COUNT(sales) "total sales" FROM transactions

于 2021-12-02T20:23:23.627 回答