2015-06-02 5 views
6

Ho una tabella in SQL Server, e ho bisogno di sommare una colonna, come nell'esempio qui sotto:SUM Colonna SQL SERVER

CREATE TABLE B 
(
ID int, 
Qty int, 
) 

INSERT INTO B VALUES (1,2) 
INSERT INTO B VALUES (2,7) 
INSERT INTO B VALUES (3,2) 
INSERT INTO B VALUES (4,11) 

SELECT *, '' AS TotalQty FROM B 
ORDER BY ID 

In questo esempio che cosa ho bisogno è la colonna TotalQty dammi i valori come:

2 
9 
11 
22 

Qualsiasi aiuto?

+2

siete alla ricerca di esecuzione totale in SQL Server – Milen

+2

http://sqlfiddle.com/#!6/fa67a/2 la vostra risposta. –

risposta

7

È possibile utilizzare SUM in una sottoquery co-correlati o CROSS APPLY come questo

Co-correlato sottoquery

SELECT ID,(SELECT SUM(Qty) FROM B WHERE B.id <= C.id) FROM B as C 
ORDER BY ID 

Utilizzando CROSS APPLY

SELECT ID,D.Qty FROM B as C 
CROSS APPLY 
(
SELECT SUM(Qty) Qty 
FROM B WHERE B.id <= C.id 
)AS D 
ORDER BY ID 

uscita

1 2 
2 9 
3 11 
4 22 

Se si sta utilizzando SQL Server 2012 o superiore, con SUM()Over() clausola avrebbe potuto essere utilizzato in questo modo.

SELECT ID, SUM(Qty) OVER(ORDER BY ID ASC) FROM B as C 
ORDER BY ID 

Modifica

Un altro modo per fare questo in SQL Server 2008 sta usando CTE ricorsiva. Qualcosa come questo.

Nota: Questo metodo si basa sulla risposta da Roman Pekar su questo thread Calculate a Running Total in SQL Server. Sulla base della sua osservazione questo sarebbe un rendimento migliore rispetto subquery correlato co e CROSS APPLY sia

;WITH CTE as 
(
SELECT ID,Qty,ROW_NUMBER()OVER(ORDER BY ID ASC) as rn 
FROM B 
), CTE_Running_Total as 
(
    SELECT Id,rn,Qty,Qty as Running_Total 
    FROM CTE 
    WHERE rn = 1 
    UNION ALL 
    SELECT C1.Id,C1.rn,C1.Qty,C1.Qty + C2.Running_Total as Running_Total 
    FROM CTE C1 
    INNER JOIN CTE_Running_Total C2 
    ON C1.rn = C2.rn + 1 
) 
SELECT * 
FROM CTE_Running_Total 
ORDER BY Id 
OPTION (maxrecursion 0) 
+1

mi sto solo pensando e ho postato risposta .. :) .. ma è più lento se la quantità di dati è troppo grande .. –

+1

@AnantDabhi - Sì, hai ragione. per grandi serie di dati questo sarà lento. 'SUM()' con 'over (ordine da id asc)' avrebbe potuto essere utilizzato, tuttavia questo è supportato solo in sql 2012 – ughai

+0

funzionerà per oltre 10 milioni di record? –