2012-04-27 11 views
5

Tengo una tabla que contiene alrededor de 50,000 registros de información que se han configurado para mirar hacia atrás hasta el inicio del año fiscal en curso.Sume un campo para cada mes acumulativa y dinámicamente

En su forma actual no he actualizado esta tabla desde el mes pasado por lo que actualmente los datos no asume todavía estamos mirando hacia atrás tan lejos como 1 de abril de 2011.

nota (cuando actualizar los datos, habrá Sólo ser datos de abril de 2012 en allí como estamos ahora en abril, luego, en mayo tendrá abril de 2012 y mayo de 2012 y así sucesivamente ...)

Cada registro tiene 4 columnas que me preocupa:

Department, 
Incident date, 
month, 
year, 
reduced 

Tanto el mes como las columnas del año se han generado para m el campo incidente fecha que está en este formato:

2011-06-29 00:00:00.000 

que necesito para cada departamento, sumar la reducida pero de una manera acumulativa.

por ejemplo visto como si abril de 2011 fuera el primer mes/año de datos que tengo en este momento, querré saber el total reducido para cada departamento en abril.

Luego de mayo Quiero abril & mayo combinarse, para junio necesito abril, mayo, junio y así sucesivamente ...

¿Hay una manera inteligente de hacer esto para que tan pronto como vuelva a importar los datos en esta tabla se dará cuenta de que ahora hay sólo un mes y que el año ha actualizado y voluntad por ahora hasta el próximo mes única visualización de la suma de abril (reducida)

+0

¿Cuál es el tipo de 'Incidente date' campo? ¿fecha y hora? varchar? –

+0

@Mark Byers datetime – JsonStatham

+0

@SelectDistinct eche un vistazo aquí: - http://stackoverflow.com/questions/2120544/how-to-get-cumulative-sum –

Respuesta

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

el siguiente devolverá los totales acumulados agrupados por Department, Year y Month . Si está borrando los datos del año fiscal anterior al actualizar, puede omitir la cláusula 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

Si está trabajando con un número incluso remotamente grande de registros, Aconsejaría mirar las otras respuestas vinculadas en la sección de comentarios. Para cualquier volumen razonable, un producto medio-cartesiano como este puede ser muy lento, tanto que incluso un cursor [* toser] puede ser más rápido. * [Pero tenga en cuenta que esto funciona:)] * – MatBailie

Cuestiones relacionadas