Grupo SQL por fecha, pero obtiene fechas sin registros también
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
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