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

Obtener recuentos diarios de eventos que no ocurren todos los días

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/