sql >> Database >  >> RDS >> Mysql

Dagelijkse tellingen krijgen voor evenementen die niet elke dag plaatsvinden

U bent op zoek naar een manier om alle dagen in de lijst te krijgen, zelfs de dagen die niet zijn vertegenwoordigd in uw customer tafel. Dit is een beruchte nekpijn in SQL. Dat komt omdat SQL in zijn pure vorm het concept mist van een aaneengesloten reeks van iets ... hoofdtelwoorden, dagen, wat dan ook.

Je moet dus een tabel introduceren die een bron bevat van aaneengesloten hoofdtelwoorden, of datums, of zoiets, en dan LEFT JOIN je bestaande gegevens aan die tabel.

Er zijn een paar manieren om dat te doen. Een daarvan is om voor jezelf een calendar te maken tabel met een rij voor elke dag in het huidige decennium of de huidige eeuw of wat dan ook, sluit u er dan bij aan. (Die tabel zal niet erg groot zijn in vergelijking met de mogelijkheden van een moderne database.

Laten we zeggen dat je die tabel hebt, en het heeft een kolom met de naam date . Dan zou je dit doen.

 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

Let op een paar dingen. Eerst de LEFT JOIN van de kalendertabel naar uw dataset. Als je een gewone JOIN . gebruikt de ontbrekende gegevens in uw dataset zullen de rijen uit de kalender onderdrukken.

Ten tweede, de ISNULL op het hoogste niveau SELECT om de ontbrekende, null-waarden van uw dataset om te zetten in nulwaarden.

Nu vraag je je af, waar kan ik die kalendertafel krijgen? Ik raad je aan om dat op te zoeken en een andere vraag te stellen als je er niet uit komt.

Ik heb hier een klein essay over geschreven, dat je hier kunt vinden.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/



  1. MySQL-volgorde per veld in Eloquent

  2. Zoek de maximale waarde en toon de bijbehorende waarde uit een ander veld in SQL-server

  3. Hoe kan ik de mysql MEMORY ENGINE meer gegevens laten opslaan?

  4. java.sql.SQLException Parameterindex buiten bereik (1> aantal parameters, dat is 0)