2012-04-27 11 views
5

Ich habe eine Tabelle, die rund 50.000 Datensätze von Informationen enthält, die eingerichtet wurden, um bis zum Beginn des laufenden Geschäftsjahres zurückzublicken.Summe ein Feld für jeden Monat kumulativ und dynamisch

Wie es aussieht ich nicht in dieser Tabelle seit dem letzten Monat aktualisiert, so zur Zeit die Daten dort annimmt suchen wir noch so weit zurück, zurück als 1. April 2011.

Note (wenn ich die Daten zu aktualisieren, wird es sein, Datum April 2012 ist nur dort, wie wir jetzt im April sind, dann Mai wird es hat April 2012 und Mai 2012 und so weiter ...)

Jeder Datensatz besteht aus 4 Spalten ich bin besorgt mit:

Department, 
Incident date, 
month, 
year, 
reduced 

Sowohl die Monats- als auch die Jahresspalte wurden generiert m das Vorfall Datum Feld, das in diesem Format ist:

2011-06-29 00:00:00.000 

ich für jede Abteilung muss die reduzierte Summe aber in einer kumulativen Weise.

zB so, als ob April 2011 die frühesten Monat/Jahr-Daten sein werden, die ich im Moment habe, werde ich wissen wollen, dass die Summe für jede Abteilung für April reduziert wird.

Dann für Mai möchte ich April & kombiniert Mai für I Juni brauchen April, Mai, Juni und so weiter ...

Gibt es eine intelligente Art und Weise dies, dass so schnell so zu tun, wie ich Daten wieder importieren in es wird diese Tabelle erkennen, dass es nur noch einen Monat ist und dass das Jahr aktualisiert und wird jetzt bis nur nächsten Monat April die Summe angezeigt werden (reduziert)

+0

Was ist der Typ des 'Vorfall date' Feld? Terminzeit? varchar? –

+0

@Mark Byers datetime – JsonStatham

+0

@SelectDistinct siehe hier: - http://stackoverflow.com/questions/2120544/how-to-get-cumulative-sum –

Antwort

1
select t1.id, t1.singlenum, SUM(t2.singlenum) as sum 

    from @t t1 inner join @t t2 on t1.id >= t2.id 
    group by t1.id, t1.singlenum 
    order by t1.id 
1

Im folgenden werden die kumulierten Summen zurückgeben gruppiert nach Department, Year und Month . Wenn Sie die Daten des vorherigen Steuerjahres beim Aktualisieren löschen, können Sie die WHERE-Klausel weglassen.

SELECT  T1.[Year], 
      T1.[Month], 
      T1.Department, 
      SUM(T2.Reduced) ReducedTotals 
FROM  [TABLENAME] T1 
INNER JOIN [TABLENAME] T2 ON (T1.Department = T2.Department AND T1.IncidentDate >= T2.IncidentDate) 
WHERE  T1.IncidentDate >= '2012-04-01' 
GROUP BY T1.[Year], 
      T1.[Month], 
      T1.Department 
ORDER BY T1.[Year], 
      T1.[Month], 
      T1.Department 
+3

Wenn Sie mit einer sogar entfernt großen Anzahl von Datensätzen arbeiten, Ich würde empfehlen, sich die anderen Antworten anzusehen, die in den Kommentaren verlinkt sind. Für ein vernünftiges Volumen kann ein solches Halb-Kartuschen-Produkt sehr langsam werden, so dass sogar ein [* hust *] - Cursor schneller sein kann. * [Aber beachten Sie, dass dies funktioniert:)] * – MatBailie

Verwandte Themen