Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abrufen täglicher Zählungen für Ereignisse, die nicht jeden Tag stattfinden

Sie suchen nach einer Möglichkeit, alle Tage aufgelistet zu bekommen, sogar die Tage, die nicht in Ihrem customer enthalten sind Tisch. Dies ist ein berüchtigter Schmerz im Nacken in SQL. Das liegt daran, dass SQL in seiner reinen Form das Konzept einer zusammenhängenden Folge von irgendetwas fehlt ... Kardinalzahlen, Tagen, was auch immer.

Sie müssen also eine Tabelle einführen, die eine Quelle zusammenhängender Kardinalzahlen oder Datumsangaben oder so etwas enthält, und dann Ihre vorhandenen Daten mit LEFT JOIN in diese Tabelle einfügen.

Dafür gibt es mehrere Möglichkeiten. Eine besteht darin, sich selbst einen calendar zu erstellen Tabelle mit einer Zeile für jeden Tag im gegenwärtigen Jahrzehnt oder Jahrhundert oder was auch immer, dann fügen Sie sie hinzu. (Diese Tabelle wird im Vergleich zu den Möglichkeiten einer modernen Datenbank nicht sehr groß sein.

Nehmen wir an, Sie haben diese Tabelle und sie hat eine Spalte mit dem Namen date . Dann würden Sie dies tun.

 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

Beachten Sie ein paar Dinge. Zuerst der LEFT JOIN von der Kalendertabelle zu Ihrem Datensatz. Wenn Sie einen gewöhnlichen JOIN verwenden die fehlenden Daten in Ihrem Datensatz unterdrücken die Zeilen aus dem Kalender.

Zweitens die ISNULL in der obersten Ebene SELECT um die fehlenden Nullwerte aus Ihrem Datensatz in Nullwerte umzuwandeln.

Jetzt fragen Sie, wo kann ich diese Kalendertabelle bekommen? Ich schlage respektvoll vor, dass Sie das nachschlagen und eine andere Frage stellen, wenn Sie es nicht herausfinden können.

Dazu habe ich einen kleinen Aufsatz geschrieben, den Sie hier finden. ">http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/