2013-07-29 4 views
35

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

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

enter image description here

+1

Sql Server имеет поддержку подытогами: [см. с rollup] (http://msdn.microsoft.com/en-us/library/ms189305%28v=sql.90%29.aspx). –

ответ

35

Если вы на 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) 
; 
12

Попробуйте использовать union all ниже

SELECT [Type], [Total Sales] From Before 
union all 
SELECT 'Total', Sum([Total Sales]) From Before 

, если у вас есть проблемы с заказом, а я-один предложил попробовать следующее:

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 
+0

Незначительное примечание здесь, если значения Тип являются алфавитными после слова (U, V, W и т. Д.) Всего, тогда общая строка может не отображаться в нижней строке ... – Sparky

+0

Я согласен с @Sparky, таким образом она должна например, 'select [Type], [Total Sales] from (SELECT [Type], [Total Sales], 0 [Key] From Before union все SELECT 'Total', Sum ([Total Sales]), 1 From Before) sq order by [Key], Type' –

+0

Не зная возможных значений [Тип], Cast() для VarChar (5) на самом деле не будет обращаться к нему. i-one показывает правильное решение, добавил числовой счетчик, чтобы заставить порядок сортировки ... – Sparky

10

Вы могли бы использовать 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 
14

Это более мощный синтаксис группировки/слияния, который вы хотите использовать в SQL Server 2008+. Всегда полезно указать версию, которую вы используете, поэтому нам не нужно гадать.

SELECT 
    [Type] = COALESCE([Type], 'Total'), 
    [Total Sales] = SUM([Total Sales]) 
FROM dbo.Before 
GROUP BY GROUPING SETS(([Type]),()); 

Крейг Фридман написал a great blog post introducing GROUPING SETS.

+0

Отличный материал, спасибо за обмен! –

Смежные вопросы