2013-07-29 5 views
35

So che sembra folle e probabilmente non dovrebbe essere fatto in questo modo, ma ho bisogno di qualcosa come questo - ho un record da SELECT [Type], [Total Sales] From BeforeAggiungere una riga di riepilogo con i totali

Voglio aggiungere una riga supplementare alla fine per mostra la SUM alla fine della tabella (After). Questo potrebbe essere fatto?

enter image description here

+1

Sql Server ha il supporto per i totali parziali: [vedere con rollup] (http://msdn.microsoft.com/en-us/library/ms189305%28v=sql.90%29.aspx). –

risposta

35

Se siete su SQL Server 2008 o versione successiva, è possibile utilizzare il ROLLUP() GROUP BY funzione:

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

Ciò presuppone che la colonna Type non può avere NULL e quindi il NULL in questa query indicherebbe il fila di rollup, quella con il totale generale. Tuttavia, se la colonna Type può avere valori null del proprio, il tipo più adatto di contabilità per la riga totale sarebbe come in @ di Declan_K risposta, vale a dire utilizzando la funzione GROUPING():

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

tenta di utilizzare union all come di seguito

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

se avete problemi con l'ordinazione, come i-uno suggerito provare questo:

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

Nota secondaria qui, se i valori di Tipo sono alfabetici dopo la parola (U, V, W, ecc.) Totale, la riga Totale potrebbe non apparire nella riga inferiore ... – Sparky

+0

Sono d'accordo con @Sparky, in questo modo dovrebbe essere eg 'selezionare [Tipo], [Vendite totali] da (SELEZIONA [Tipo], [Vendite totali], 0 [Chiave] Da prima dell'unione tutte SELEZIONA 'Totale', Somma ([Vendite totali]), 1 Da prima) sq ordina per [Chiave], Tipo ' –

+0

Senza conoscere i possibili valori di [Tipo], Cast() a VarChar (5) non lo risolverà. i-one mostra la soluzione giusta, ha aggiunto un contatore numerico per forzare l'ordinamento ... – Sparky

10

è possibile utilizzare il ROLLUP operatore

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

Questa è la sintassi di raggruppamento/rollup più potente che si desidera utilizzare in SQL Server 2008+. Sempre utile per specificare la versione che stai utilizzando in modo da non dover indovinare.

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

Craig Freedman ha scritto a great blog post introducing GROUPING SETS.

+0

Grandi cose, grazie per aver condiviso! –

Problemi correlati