2013-07-29 16 views
35

Wiem, że to brzmi absurdalnie i chyba nie powinno odbywać się w ten sposób, ale muszę coś takiego - Mam rekordy od SELECT [Type], [Total Sales] From BeforeDodaj wiersz podsumowania z sumy

Chcę dodać dodatkowy wiersz na zakończenie pokaż SUM na końcu tabeli (After). Czy można to zrobić?

enter image description here

+1

SQL Server obsługuje sumy cząstkowe: [patrz z rollup] (http://msdn.microsoft.com/en-us/library/ms189305%28v=sql.90%29.aspx). –

Odpowiedz

35

Jeśli jesteś na SQL Server 2008 lub nowszej, można użyć GROUP ROLLUP() przez funkcję:

SELECT 
    Type = ISNULL(Type, 'Total'), 
    TotalSales = SUM(TotalSales) 
FROM atable 
GROUP BY ROLLUP(Type) 
; 

ta zakłada, że ​​kolumna Type nie może mieć wartości null i tak NULL w tego zapytania będzie wskazywać wiersz zwijania, ten z sumą całkowitą. Jednakże, jeśli kolumna Type może mieć wartości null własnych, tym bardziej właściwy rodzaj rachunkowości za łączną rzędu będzie jak w użytkownika @ Declan_K odpowiedź, czyli używając GROUPING() funkcję:

SELECT 
    Type = CASE GROUPING(Type) WHEN 1 THEN 'Total' ELSE Type END, 
    TotalSales = SUM(TotalSales) 
FROM atable 
GROUP BY ROLLUP(Type) 
; 
12

spróbuje użyć union all jak poniżej

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

jeśli masz problem z zamówieniem, jak i jeden zasugerował spróbuj tego:

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

Niewielka uwaga tutaj, jeśli wartości Typu są alfabetyczne po słowie (U, V, W, itd.) Suma, wtedy Łączna linia może nie pojawić się w dolnym wierszu ... – Sparky

+0

Zgadzam się z @Sparky, w ten sposób powinno być np 'wybierz [Typ], [Całkowita sprzedaż] od (WYBIERZ [Typ], [Całkowita sprzedaż], 0 [Klucz] Od Przed połączeniem wszystkie WYBIERZ" Łącznie ", Suma ([Całkowita sprzedaż]), 1 Od wcześniej) zamówienie sq przez [Key], Type' –

+0

Nie znając możliwych wartości [Type], Cast() do VarChar (5) tak naprawdę nie adresuje tego. i-one pokazuje właściwe rozwiązanie, dodaje licznik numeryczny wymuszający kolejność sortowania ... – Sparky

10

można użyć ROLLUP operator

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

To jest bardziej wydajna składnia grupująca/składniowa, z której będziesz korzystać w SQL Server 2008+. Zawsze warto podać wersję, której używasz, więc nie musimy zgadywać.

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

Craig Freedman napisał a great blog post introducing GROUPING SETS.

+0

Świetne rzeczy, dzięki za udostępnienie! –

Powiązane problemy