Mysql
 sql >> Database >  >> RDS >> Mysql

Ottenere conteggi giornalieri per eventi che non accadono tutti i giorni

Stai cercando un modo per ottenere tutti i giorni elencati, anche quei giorni che non sono rappresentati nel tuo customer tavolo. Questo è un famigerato dolore al collo in SQL. Questo perché nella sua forma pura SQL manca del concetto di una sequenza contigua di qualsiasi cosa... numeri cardinali, giorni, qualunque cosa.

Quindi, devi introdurre una tabella contenente una fonte di numeri cardinali contigui, o date, o qualcosa del genere, e quindi LEFT JOIN i tuoi dati esistenti a quella tabella.

Ci sono alcuni modi per farlo. Uno è creare un calendar tavolo con una riga per ogni giorno del decennio o del secolo attuale o altro, quindi unisciti ad esso. (Quella tabella non sarà molto grande rispetto alla capacità di un database moderno.

Supponiamo che tu abbia quella tabella e che abbia una colonna denominata date . Allora lo faresti.

 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

Nota un paio di cose. Innanzitutto, il LEFT JOIN dalla tabella del calendario al tuo set di dati. Se utilizzi un normale JOIN i dati mancanti nel tuo set di dati elimineranno le righe dal calendario.

Secondo, il ISNULL nel livello superiore SELECT per trasformare i valori nulli mancanti dal tuo set di dati in valori zero.

Ora, chiedi, dove posso trovare quella tabella del calendario? Ti suggerisco rispettosamente di cercarlo e di fare un'altra domanda se non riesci a capirlo.

Ho scritto un piccolo saggio su questo, che puoi trovare qui.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-interegers/