Добавить итоговую строку с итогами
Я знаю, что это звучит безумно и, вероятно, этого не должно быть сделано, но мне нужно что-то вроде этого: у меня есть записи из SELECT [Type], [Total Sales] From Before
Я хочу добавить дополнительную строку в конец, чтобы показать SUM в конце таблицы (After). Это можно сделать?
![enter image description here]()
Ответы
Ответ 1
Если вы используете 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)
;
Ответ 2
Это более мощный синтаксис группировки/слияния, который вы хотите использовать в SQL Server 2008+. Всегда полезно указать версию, которую вы используете, поэтому нам не нужно гадать.
SELECT
[Type] = COALESCE([Type], 'Total'),
[Total Sales] = SUM([Total Sales])
FROM dbo.Before
GROUP BY GROUPING SETS(([Type]),());
Крейг Фридман написал отличный пост в блоге, представляющий GROUPING SETS
.
Ответ 3
Попробуйте использовать 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
Ответ 4
Вы можете использовать оператор 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
Ответ 5
Если вы хотите отобразить больше значений столбцов без функции агрегирования, используйте 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