2012-04-27 16 views
5

Ho una tabella che contiene circa 50.000 registrazioni di informazioni che sono state impostate per guardare indietro fino all'inizio dell'anno finanziario in corso.Sommare un campo per ogni mese cumulativamente e dinamicamente

Così com'è non ho aggiornato questo tavolo dal mese scorso in modo attualmente i dati in là assume siamo ancora alla ricerca di nuovo fin dal 1 aprile 2011.

nota (quando ho aggiornano i dati, ci sarà essere solo dati di aprile 2012 di lì come siamo ora nel mese di aprile, poi a maggio avrà aprile 2012 e maggio 2012 e così via ...)

Ogni record ha 4 colonne che mi interessa:

Department, 
Incident date, 
month, 
year, 
reduced 

Entrambe le colonne del mese e dell'anno sono state generate per m il incidente data di campo che è in questo formato:

2011-06-29 00:00:00.000 

ho bisogno di per ogni reparto, sommare il ridotto, ma in modo cumulativo.

ad esempio, visto che aprile 2011 saranno i primi dati mese/anno che ho al momento, voglio sapere il totale ridotto per ogni reparto per aprile.

Poi per maggio voglio aprile & maggio combinati, per giugno ho bisogno di aprile, maggio, giugno e così via ...

C'è un modo intelligente per fare questo in modo che non appena ho reimportare i dati in questa tabella si renderà conto che ora c'è soltanto un mese e che l'anno ha aggiornato e la volontà per ora fino al mese prossimo visualizzare solo somma di April (ridotto)

+0

Qual è il tipo di incidente date' campo '? appuntamento? varchar? –

+0

@Mark Byers datetime – JsonStatham

+0

@SelectDistinct dai uno sguardo qui: - http://stackoverflow.com/questions/2120544/how-to-get-cumulative-sum –

risposta

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

di seguito restituirà i totali cumulativi raggruppati per Department, Year e Month . Se si stanno cancellando i dati dell'anno fiscale precedente durante l'aggiornamento, è possibile omettere la clausola WHERE.

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

Se stai lavorando con un numero di record anche lontanamente elevato, Consiglierei di guardare le altre risposte collegate nella sezione commenti. Per ogni volume ragionevole un prodotto mezzo-cartesiano come questo può diventare molto lento, tanto che anche un cursore [* cough *] può essere più veloce. * [Ma fai notare che questo funziona:)] * – MatBailie

Problemi correlati