sql >> Base de Datos >  >> RDS >> Mysql

Total acumulado sobre el rango de fechas:complete las fechas que faltan

Para cubrir los meses faltantes, cree una tabla de plantilla para unirse.

Piense en ello como almacenamiento en caché. En lugar de recorrer y llenar los vacíos, simplemente tenga un calendario almacenado en caché en su base de datos.

Incluso puede combinar varios calendarios (inicio de mes, inicio de semana, días festivos, días laborables, etc.) en una sola tabla, con un montón de índices y banderas de búsqueda.

Terminas con algo como...

SELECT
  calendar.date,
  SUM(data.amt)
FROM
  calendar
LEFT JOIN
  data
    ON  data.date >= calendar.date
    AND data.date <  calendar.date + INTERVAL 1 MONTH
WHERE
      calendar.date >= '20110101'
  AND calendar.date <  '20120101'
GROUP BY
  calendar.date

EDITAR

Acabo de darme cuenta de que el OP quiere un total acumulado.

Esto -es- posible en SQL pero es extremadamente ineficiente. El motivo es que el resultado de un mes no se utiliza para calcular el mes siguiente. En su lugar, el total acumulado completo debe calcularse nuevamente.

Por esta razón, normalmente se recomienda encarecidamente que calcule el total mensual como se indicó anteriormente, luego use su aplicación para iterar y obtener los valores totales acumulados.

Si realmente debe hacerlo en SQL, sería algo como...

SELECT
  calendar.date,
  SUM(data.amt)
FROM
  calendar
LEFT JOIN
  data
    ON  data.date >= @yourFirstDate
    AND data.date <  calendar.date + INTERVAL 1 MONTH
WHERE
      calendar.date >= @yourFirstDate
  AND calendar.date <  @yourLastDate
GROUP BY
  calendar.date