2017-01-27 1 views
0

Ich versuche, eine laufende Summe mit OVER (PARTITION BY) zu erstellen, um eine laufende Summe zu erstellen.Laufende Summe Für den Datensatz gruppiert nach Monat, Jahr

Meine ursprüngliche Abfrage:

SELECT DATEPART(MONTH, t.received_date) AS [Month], 
DATEPART(YEAR, t.received_date) AS [Year], 
SUM(rdai.number_of_pages) AS [Count] 
FROM dbo.request_document_additonal_information AS [rdai] 
INNER JOIN #TempRequestIDs AS [t] 
    ON rdai.request_id = t.id 
GROUP BY DATEPART(MONTH, t.received_date), 
DATEPART(YEAR, t.received_date) 
ORDER BY Year, 
Month; 

Und die Ergebnisse:

Month Year Count 
10  2015 1202342 
11  2015 1059471 
12  2015 1142629 
1  2016 1081412 
2  2016 1181385 
3  2016 1334966 

Mein Ziel ist es, eine laufende Zwischensumme für jeden Monat und mein Versuch zu schaffen, dies zu tun:

SELECT DATEPART(MONTH, t.received_date) AS [Month], 
DATEPART(YEAR, t.received_date) AS [Year], 
SUM(rdai.number_of_pages) AS [Count] 
,SUM(rdai.number_of_pages) OVER (PARTITION BY DATEPART(MONTH, t.received_date), DATEPART(YEAR, t.received_date) 
           ORDER BY DATEPART(MONTH, t.received_date), DATEPART(YEAR, t.received_date) 
           RANGE UNBOUNDED PRECEDING 
           ) as [RunningTotal] 
FROM dbo.request_document_additonal_information AS [rdai] 
INNER JOIN #TempRequestIDs AS [t] 
    ON rdai.request_id = t.id 
GROUP BY DATEPART(MONTH, t.received_date), 
DATEPART(YEAR, t.received_date) 
ORDER BY Year, 
Month; 

Aber der Fehler zurückgegebene Zustände:

Column 'dbo.request_document_additonal_information.number_of_pages' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

Und wenn ich GROUP BY .... rdai.number_of_pages hinzufügen, wird die laufende Summe aufgelistet, aber es ist die gleiche Anzahl für alle Spalten.

Kann ich mithilfe dieser Fensterfunktion Hilfe bekommen, wo ich falsch liege?

Danke,

Antwort

2

Eine Option ist Ihre ursprüngliche Abfrage

nisten
Select A.* 
     ,RunningTotal = sum(count) over (Order by Year ,Month) 
From (
     SELECT DATEPART(MONTH, t.received_date) AS [Month], 
     DATEPART(YEAR, t.received_date) AS [Year], 
     SUM(rdai.number_of_pages) AS [Count] 
     FROM dbo.request_document_additonal_information AS [rdai] 
     INNER JOIN #TempRequestIDs AS [t] 
      ON rdai.request_id = t.id 
     GROUP BY DATEPART(MONTH, t.received_date), 
     DATEPART(YEAR, t.received_date) 
    ) A 
ORDER BY Year,Month; 
+0

Dank John - das funktioniert aber es zurückgesetzt wird, wenn das Jahr ändert. Gibt es einen Weg dahin? – MISNole

+0

@MISNole Sicher. Entschuldigung, ich nahm an, du wolltest eine Änderung vornehmen. Siehe aktualisierte Antwort ... Entfernte Partition nach und änderte die Reihenfolge nach Jahr, Monat –

+0

Danke - in diesem Fall brauchte ich keinen Reset, aber ich werde beide Beispiele für zukünftige Verwendung speichern. Ich schätze es. – MISNole

Verwandte Themen