Подтвердить что ты не робот

Добавить итоговую строку с итогами

Я знаю, что это звучит безумно и, вероятно, этого не должно быть сделано, но мне нужно что-то вроде этого: у меня есть записи из SELECT [Type], [Total Sales] From Before

Я хочу добавить дополнительную строку в конец, чтобы показать SUM в конце таблицы (After). Это можно сделать?

enter image description here

4b9b3361

Ответ 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