Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Obter contagens diárias para eventos que não acontecem todos os dias


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/