Você está procurando uma maneira de obter todos os dias listados, mesmo aqueles dias que não estão representados em seu
customer
tabela. Esta é uma notória dor no pescoço em SQL. Isso porque em sua forma pura o SQL não tem o conceito de uma sequência contígua de qualquer coisa... números cardinais, dias, o que for. Então, você precisa introduzir uma tabela contendo uma fonte de números cardinais contíguos, ou datas, ou algo assim, e então LEFT JOIN seus dados existentes para essa tabela.
Existem algumas maneiras de fazer isso. Uma é criar você mesmo um
calendar
tabela com uma linha para cada dia na presente década ou século ou qualquer outra coisa, então junte-se a ela. (Essa tabela não será muito grande em comparação com a capacidade de um banco de dados moderno. Digamos que você tenha essa tabela e tenha uma coluna chamada
date
. Então você faria isso. 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
Observe algumas coisas. Primeiro, o
LEFT JOIN
da tabela de calendário para seu conjunto de dados. Se você usar um JOIN
comum os dados ausentes em seu conjunto de dados suprimirão as linhas do calendário. Segundo, o
ISNULL
no nível superior SELECT
para transformar os valores ausentes e nulos do conjunto de dados em valores zero. Agora, você pergunta, onde posso conseguir essa tabela de calendário? Eu respeitosamente sugiro que você procure isso e faça outra pergunta se não conseguir descobrir.
Eu escrevi um pequeno ensaio sobre isso, que você pode encontrar aqui.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/