Está buscando una manera de obtener todos los días en la lista, incluso aquellos días que no están representados en su customer
mesa. Este es un dolor de cabeza notorio en SQL. Eso es porque en su forma pura SQL carece del concepto de una secuencia contigua de cualquier cosa... números cardinales, días, lo que sea.
Por lo tanto, debe introducir una tabla que contenga una fuente de números cardinales contiguos, o fechas, o algo así, y luego LEFT JOIN sus datos existentes en esa tabla.
Hay algunas formas de hacerlo. Una es crearte un calendar
tabla con una fila para cada día en la presente década o siglo o lo que sea, luego únase a ella. (Esa tabla no será muy grande en comparación con la capacidad de una base de datos moderna.
Digamos que tiene esa tabla y tiene una columna llamada date
. Entonces harías esto.
SELECT calendar.date AS created,
ISNULL(a.customer_count, 0) AS customer_count
FROM calendar
LEFT JOIN (
SELECT COUNT(*) AS customer_count,
DATE(created) AS created
FROM customer
GROUP BY DATE(created)
) a ON calendar.date = a.created
WHERE calendar.date BETWEEN start AND finish
ORDER BY calendar.date
Fíjate en un par de cosas. Primero, el LEFT JOIN
de la tabla de calendario a su conjunto de datos. Si usa un JOIN
ordinario los datos que faltan en su conjunto de datos suprimirán las filas del calendario.
En segundo lugar, el ISNULL
en el nivel superior SELECT
para convertir los valores nulos faltantes de su conjunto de datos en valores cero.
Ahora, usted pregunta, ¿dónde puedo conseguir esa tabla de calendario? Te sugiero respetuosamente que busques eso y hagas otra pregunta si no puedes resolverlo.
Escribí un pequeño ensayo sobre esto, que puedes encontrar aquí.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/