2012-05-14 19 views
10

tengo SQL del modo siguiente ($ytoday es hace 5 días):¿Cómo hacer que GROUP BY y COUNT incluyan cero sumas?

$sql = 'SELECT Count(*), created_at FROM People WHERE created_at >= "'. $ytoday .'" AND GROUP BY DATE(created_at)'; 

Quiero que esto devuelve un valor para cada día, por lo que volvería 5 resultados en este caso (hace 5 días hasta hoy) .

Pero decir Count(*) es 0 para ayer, en lugar de devolver un cero, no devuelve ningún dato para esa fecha.

¿Cómo puedo cambiar esa consulta de SQLite para que también devuelva datos que tienen un recuento de 0?

+0

Seleccionar todos las filas que desea en primer lugar, a continuación, ejecute un recuento de estas filas (izquierda unirse quizás) – keyser

Respuesta

9

Sin consultas contorneados (en mi opinión), la salida de datos en serie ganó' t incluir fechas que no existen en su conjunto de datos de entrada. Esto significa que necesita un conjunto de datos con los 5 días para unirse.

La versión simple sería crear una tabla con las 5 fechas, y únete a eso. Normalmente creo y guardo (almacenamiento en caché eficaz) una tabla de calendario con cada fecha que pueda necesitar. (por ejemplo, de 1900-01-01 a 31/12/2099.)

SELECT 
    calendar.calendar_date, 
    Count(People.created_at) 
FROM 
    Calendar 
LEFT JOIN 
    People 
    ON Calendar.calendar_date = People.created_at 
WHERE 
    Calendar.calendar_date >= '2012-05-01' 
GROUP BY 
    Calendar.calendar_date 
+0

Hmm, parece sencillo suficiente. Sin embargo, estos siempre son los últimos 5 días, por lo que una tabla estática no funcionaría. ¿Pensamientos? – JBurace

+0

@JBurace - Una tabla estática funciona. Usted acaba de cambiar su cláusula WHERE. Por ejemplo, el mío muestra "cada fecha desde '' 2012-05-01''" porque soy flojo y no especificó un rango de 5 días en esa cláusula WHERE. Luego haga lo que ya hace y cree esa cláusula WHERE para satisfacer sus necesidades. – MatBailie

+0

Hmm está bien. Pensé que 'crear una tabla con las 5 fechas' significaba crear una tabla con solo 5 entradas. – JBurace

4

Tendrá que unirse contra una lista de fechas. Puede crear una tabla con las fechas que usted necesita en el mismo, o puede tomar el enfoque dinámico he descrito aquí:

generate days from date range