2016-05-22 13 views
1

Meine Tabelle wird wie folgtkumulative Summe Monat, wenn angegeben Tage

T1 (date int, dateYearMonth int, userID int, shopID int, amount numeric(18,2)) 

Beispieldaten:

(20151212, 201512, 1, 1, 50.00), 
(20151213, 201512, 1, 1, 30.00), 
(20160110, 201601, 1, 1, 13.00) 

I kumulativen Summen eines jeden Monats für Benutzer zurückkehren möchten, meine Frage ist:

select t.dateYearMonth, t.userID, 
sum(t.sum_amount) over 
(partition by t.userID order by t.dateYearMonth 
rows between unbounded preceding and current row) 
from (select dateYearMonth, userID, sum(amount) as sum_amount FROM T1 
group by dateYearMonth, userID) t 

Gibt es einen optimalen Weg dies zu tun? Ausgang erwartet

(201512, 1, 1, 80.00), (201601, 1, 1, 93.00) 
+0

Warum '93.00' für' 201601'? –

+0

Dies ist kumulative Summe - es steigt über die Monate (vorheriger Wert + aktueller Wert) –

+0

Versuchen Sie rekursive CTE und vergleichen Sie die Leistung mit Ihrem Ansatz. Recursive Cte ​​sollte auch mit einer früheren Version von SQL Server funktionieren. –

Antwort

0

Sie verwenden:

SELECT DISTINCT dateYearMonth, userID 
     ,total = SUM(amount) OVER(PARTITION BY userID ORDER BY dateYearMonth) 
FROM T1; 

LiveDemo

0

Ich glaube, Ihre Frage ziemlich gut ist wie es ist. Ich denke nicht, dass es besser gemacht werden kann.

Stellen Sie sicher, dass Sie einen abdeckenden Index haben, wie folgt aus:

CREATE NONCLUSTERED INDEX [IX] ON T1 
(
    userID ASC 
    ,dateYearMonth ASC 
) INCLUDE(amount); 

der Ausführungsplan für die temporäre Tabelle mit Beispieldaten wie folgt aussieht Mit diesem Index:

execution plan

Es liest nur alle Zeilen aus der Tabelle (Index) und Gruppen/summiert sie ohne zusätzliche Sortierung.