Pregunta

¿Hay una manera fácil de hacer un GROUP BY DATE (timestamp) que incluya todos los días en un período de tiempo, independientemente de si hay registros asociados con esa fecha?

Básicamente, necesito generar un informe como este:

24 Dec - 0 orders
23 Dec - 10 orders
22 Dec - 8 orders
21 Dec - 2 orders
20 Dec - 0 orders
¿Fue útil?

Solución

En lugar de usar GROUP BY, haga una tabla (tal vez una tabla temporal) que contenga las fechas específicas que desea, por ejemplo:

24 Dec
23 Dec
22 Dec
21 Dec
20 Dec

Luego, une esa tabla a la tabla Pedidos.

Otros consejos

Suponiendo que tenga más pedidos que fechas, algo como esto podría funcionar:

select date, count(id) as orders
from
(
  SELECT DATE_ADD('2008-01-01', INTERVAL @rn:=@rn+1 DAY) as date from (select @rn:=-1)t, `order` limit 365
) d left outer join `order` using (date)
group by date

Un método es crear una tabla de calendario y unirte contra ella.

Lo crearía de forma permanente y luego crearía una tarea que insertará nuevas fechas, podría hacerse semanalmente, diariamente, mensualmente, etc.

Tenga en cuenta que asumo que está convirtiendo su marca de tiempo en una fecha.

necesita generar un conjunto de resultados intermedio con todas las fechas que desee incluir en la salida ...

si está haciendo esto en un proceso almacenado, podría crear una tabla temporal o una variable de tabla (no conozco las capacidades de MySQL), pero una vez que tenga todas las fechas en una tabla o conjunto de resultados de algún tipo

Simplemente únete a los datos reales de la tabla temporal, usando una combinación externa

En SQL Server sería así

  Declare @Dates Table (aDate DateTime Not Null)
  Declare @StartDt DateTime Set @StartDt = 'Dec 1 2008'
  Declare @EndDt   DateTime Set @EndDt   = 'Dec 31 2008'
  While @StartDt < @EndDt Begin
    Insert @Dates(aDate) Values(@StartDt)
    Set @StartDt = DateAdd(Day, 1, @StartDt)
  End

   Select D.aDate, Count(O.*) Orders
   From @Dates D Left Join 
      OrderTable O On O.OrderDate = D.aDate
   Group By D.aDate

En un almacén de datos, el método adoptado es crear una tabla que contenga todas las fechas y crear una clave externa entre sus datos y la tabla de fechas. No estoy diciendo que esta sea la mejor manera de proceder en su caso, solo que es la mejor práctica en los casos en los que se deben acumular grandes cantidades de datos de muchas maneras para los informes.

Si está utilizando una capa de informes sobre SQL Server, podría escribir algo de lógica para insertar las fechas que faltan dentro del rango de interés después de que se devuelvan los datos y antes de presentar su informe.

Si está creando sus informes directamente desde SQL Server y aún no tiene un almacén de datos y no hay tiempo o necesidad de crear uno ahora, crearía una tabla de fechas y me uniría a ella. El formato necesario para realizar la unión y obtener la salida que desea puede ser un poco torpe, pero hará el trabajo.

Hay una forma bastante sencilla de hacer esto & # 8230; excepto que no puedo recordarlo. Pero adapté esta consulta de este hilo :

SELECT 
    DISTINCT(LEFT(date_field,11)) AS `Date`,
    COUNT(LEFT(date_field,11)) AS `Number of events`
FROM events_table
GROUP BY `Date`

También funciona en MySQL

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top