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/