sql >> Databasteknik >  >> RDS >> Mysql

Att få dagliga räkningar för händelser som inte händer varje dag

Du letar efter ett sätt att få alla dagar listade, även de dagar som inte är representerade i din customer tabell. Detta är en ökänd smärta i nacken i SQL. Det beror på att SQL i sin rena form saknar konceptet med en sammanhängande sekvens av vad som helst ... kardinaltal, dagar, vad som helst.

Så du måste introducera en tabell som innehåller en källa med sammanhängande kardinalnummer, eller datum eller något, och sedan VÄNSTER FÖRENA dina befintliga data till den tabellen.

Det finns några sätt att göra det på. En är att skapa dig en calendar bord med en rad för varje dag under innevarande årtionde eller århundrade eller vad som helst, gå sedan med i det. (Den tabellen kommer inte att vara särskilt stor jämfört med kapaciteten hos en modern databas.

Låt oss säga att du har den tabellen och den har en kolumn som heter date . Då skulle du göra det här.

 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

Lägg märke till ett par saker. Först, LEFT JOIN från kalendertabellen till din datauppsättning. Om du använder en vanlig JOIN de data som saknas i din datamängd kommer att dölja raderna från kalendern.

För det andra, ISNULL i toppnivån SELECT för att omvandla de saknade nollvärdena från din datauppsättning till nollvärden.

Nu frågar du, var kan jag få tag i det där kalenderbordet? Jag föreslår respektfullt att du slår upp det och ställer en annan fråga om du inte kan lista ut det.

Jag skrev en liten uppsats om detta, som du hittar här.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/



  1. WHERE-sats i INSERT-satsen med mysql/php

  2. Hur man söker efter exakt matchade ord med MySql Query

  3. Postgres - Konvertera angränsande lista till kapslade JSON-objekt

  4. Hur UTC_TIMESTAMP() fungerar i MariaDB