2015-06-02 18 views
6

Mam tabeli w SQL Server i muszę podsumować kolumnę, jak na poniższym przykładzie:SUM Kolumna 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 

W tym przykładzie, co potrzebne jest kolumna TotalQty dać mi wartości takich jak:

2 
9 
11 
22 

Każda pomoc?

+2

szukasz działa łącznie w serwerze sql – Milen

+2

http://sqlfiddle.com/#!6/fa67a/2 odpowiedź. –

Odpowiedz

7

Można użyć SUM w podkwerendzie związanych z równoległym lub CROSS APPLY jak ten

związane CO-Podkwerenda

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

Korzystanie 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 

Output

1 2 
2 9 
3 11 
4 22 

Jeśli uzywasz SQL Server 2012 lub nowszy, SUM() z Over() klauzuli mogły być używane w ten sposób.

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

Edit

Innym sposobem, aby to zrobić w SQL Server 2008 korzysta rekurencyjne CTE. Coś takiego.

Uwaga: Metoda ta opiera się na odpowiedź, Roman Pekar na tym wątku Calculate a Running Total in SQL Server. Na podstawie jego obserwacji byłoby to skuteczniejsze niż związane współpracy podzapytania i CROSS APPLY zarówno

;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

Po prostu myślę to samo i wysłałeś odpowiedź .. :) .. ale wolniej, jeśli ilość danych jest zbyt duża .. –

+1

@AnantDabhi - Tak, masz rację. w przypadku dużych zbiorów danych będzie to powolne. Można użyć 'SUM()' z 'over (order by id asc)', ale jest to obsługiwane tylko w sql 2012 – ughai

+0

czy będzie działać dla ponad 10 milionów rekordów? –