Mange gange skal vi udfylde manglende datoer i MySQL-data ved at udfylde manglende rækker for disse datoer. Sådan udfylder du manglende datoer og huller i datosekvenser for at skabe en ordentlig salgsrapport, der ikke har nogen manglende rækker.
Hvordan udfylder man manglende datoer i MySQL?
Her er trinene til at udfylde manglende datoer i MySQL. Lad os sige, at du har følgende tabel salg(ordre_dato, udsalg)
mysql> create table sales(order_date date,sale int); mysql> insert into sales(order_date,sale) values('2020-04-01',212), ('2020-04-04',220), ('2020-04-05',120), ('2020-04-07',200), ('2020-04-08',222), ('2020-04-10',312), ('2020-04-11',225), ('2020-04-12',212); mysql> select * from sales; +------------+------+ | order_date | sale | +------------+------+ | 2020-04-01 | 212 | | 2020-04-04 | 220 | | 2020-04-05 | 120 | | 2020-04-07 | 200 | | 2020-04-08 | 222 | | 2020-04-10 | 312 | | 2020-04-11 | 225 | | 2020-04-12 | 212 | +------------+------+
Som du kan se i tabellen ovenfor, er der ingen data for mange datoer i mellem, såsom 2., 3. april osv.
Hvis vi forsøger at plotte disse data på en graf, vil det ligne
Sådan en graf kan være vildledende, da den ikke viser kolonnehuller for manglende datoer.
Bonuslæsning:SQL-forespørgsel til sammenligning af produktsalg efter måned
For at udfylde manglende datorækker i MySQL skal vi oprette en hjælpetabel, der indeholder alle påkrævede datoer, uden sekvenshuller eller manglende datoer, og derefter forbinde den med vores salg tabel.
Sådan opretter du vores hjælpetabel kalender .
mysql> CREATE TABLE calendar (datefield DATE); mysql> insert into calendar(datefield) values('2020-04-01'), ('2020-04-02'), ('2020-04-03'), ('2020-04-04'), ('2020-04-05'), ('2020-04-06'), ('2020-04-07'), ('2020-04-08'), ('2020-04-09'), ('2020-04-10'), ('2020-04-11'), ('2020-04-12'), ('2020-04-13'), ('2020-04-14'), ('2020-04-15'), ('2020-04-16'), ('2020-04-17'), ('2020-04-18'), ('2020-04-19'), ('2020-04-20'), ('2020-04-21'), ('2020-04-22'), ('2020-04-23'), ('2020-04-24'), ('2020-04-25'), ('2020-04-26'), ('2020-04-27'), ('2020-04-28'), ('2020-04-29'), ('2020-04-30'); mysql> select * from calendar; +------------+ | datefield | +------------+ | 2020-04-01 | | 2020-04-02 | | 2020-04-03 | | 2020-04-04 | | 2020-04-05 | | 2020-04-06 | | 2020-04-07 | | 2020-04-08 | | 2020-04-09 | | 2020-04-10 | | 2020-04-11 | | 2020-04-12 | | 2020-04-13 | | 2020-04-14 | | 2020-04-15 | | 2020-04-16 | | 2020-04-17 | | 2020-04-18 | | 2020-04-19 | | 2020-04-20 | | 2020-04-21 | | 2020-04-22 | | 2020-04-23 | | 2020-04-24 | | 2020-04-25 | | 2020-04-26 | | 2020-04-27 | | 2020-04-28 | | 2020-04-29 | | 2020-04-30 | +------------+
Der er også en kortere vej at oprette en kalendertabel, hvis du er fortrolig med at bruge lagrede procedurer.
mysql> DELIMITER | CREATE PROCEDURE fill_calendar(start_date DATE, end_date DATE) BEGIN DECLARE crt_date DATE; SET crt_date=start_date; WHILE crt_date <= end_date DO INSERT INTO calendar VALUES(crt_date); SET crt_date = ADDDATE(crt_date, INTERVAL 1 DAY); END WHILE; END | DELIMITER ;
Du kan kalde denne funktion ved at bruge CALL-funktionen. For datointerval fra 1. til 30. april,
mysql> CALL fill_calendar('2020-04-01', '2020-04-31');
Bonus Læs:Sådan beregner du salg pr. måned i MySQL
Til sidst laver vi en LEFT join af kalender tabel med salg at udfylde manglende datorækker i MySQL.
mysql> select datefield,sum(sale) from calendar left join sales on datefield=order_date group by datefield; +------------+-----------+ | datefield | sum(sale) | +------------+-----------+ | 2020-04-01 | 212 | | 2020-04-02 | NULL | | 2020-04-03 | NULL | | 2020-04-04 | 220 | | 2020-04-05 | 120 | | 2020-04-06 | NULL | | 2020-04-07 | 200 | | 2020-04-08 | 222 | | 2020-04-09 | NULL | | 2020-04-10 | 312 | | 2020-04-11 | 225 | | 2020-04-12 | 212 | | 2020-04-13 | NULL | | 2020-04-14 | NULL | | 2020-04-15 | NULL | | 2020-04-16 | NULL | | 2020-04-17 | NULL | | 2020-04-18 | NULL | | 2020-04-19 | NULL | | 2020-04-20 | NULL | | 2020-04-21 | NULL | | 2020-04-22 | NULL | | 2020-04-23 | NULL | | 2020-04-24 | NULL | | 2020-04-25 | NULL | | 2020-04-26 | NULL | | 2020-04-27 | NULL | | 2020-04-28 | NULL | | 2020-04-29 | NULL | | 2020-04-30 | NULL | +------------+-----------+
Som du kan se, indeholder ovenstående tabel alle datoer, med salg for de rækker, hvor data er til stede, og NULL for manglende datorækker.
Hvis du vil erstatte disse NULL'er med 0, kan du bruge en IFNULL-funktion,
mysql> select datefield,IFNULL(sum(sale),0) from calendar left join sales on datefield=order_date group by datefield; +------------+---------------------+ | datefield | IFNULL(sum(sale),0) | +------------+---------------------+ | 2020-04-01 | 212 | | 2020-04-02 | 0 | | 2020-04-03 | 0 | | 2020-04-04 | 220 | | 2020-04-05 | 120 | | 2020-04-06 | 0 | | 2020-04-07 | 200 | | 2020-04-08 | 222 | | 2020-04-09 | 0 | | 2020-04-10 | 312 | | 2020-04-11 | 225 | | 2020-04-12 | 212 | | 2020-04-13 | 0 | | 2020-04-14 | 0 | | 2020-04-15 | 0 | | 2020-04-16 | 0 | | 2020-04-17 | 0 | | 2020-04-18 | 0 | | 2020-04-19 | 0 | | 2020-04-20 | 0 | | 2020-04-21 | 0 | | 2020-04-22 | 0 | | 2020-04-23 | 0 | | 2020-04-24 | 0 | | 2020-04-25 | 0 | | 2020-04-26 | 0 | | 2020-04-27 | 0 | | 2020-04-28 | 0 | | 2020-04-29 | 0 | | 2020-04-30 | 0 | +------------+---------------------+
Bonuslæser:Sådan opretter du dynamisk pivottabel i MySQL
Når vi udfylder manglende datoer i MySQL, får vi også data til fremtidige datoer. Hvis du også vil fjerne disse ekstra 0 rækker, der er til stede i kalenderen efter den seneste ordre_date du kan gøre det med WHERE-klausulen
mysql> select datefield,IFNULL(sum(sale),0) from calendar left join sales on datefield=order_date where datefield between (SELECT MIN(DATE(order_date)) FROM sales) AND (SELECT MAX(DATE(order_date)) FROM sales) group by datefield; +------------+---------------------+ | datefield | IFNULL(sum(sale),0) | +------------+---------------------+ | 2020-04-01 | 212 | | 2020-04-02 | 0 | | 2020-04-03 | 0 | | 2020-04-04 | 220 | | 2020-04-05 | 120 | | 2020-04-06 | 0 | | 2020-04-07 | 200 | | 2020-04-08 | 222 | | 2020-04-09 | 0 | | 2020-04-10 | 312 | | 2020-04-11 | 225 | | 2020-04-12 | 212 | +------------+---------------------+
Når du har udfyldt manglende datoer i MySQL, kan du bruge et rapporteringsværktøj til at plotte disse data på et søjlediagram eller dashboard og dele dem med dit team. Her er et eksempel på et søjlediagram, der viser daglige salg, oprettet ved hjælp af Ubiq.
Se forskellen i 2 diagrammer!
Hvis du vil oprette diagrammer, dashboards og rapporter fra MySQL-databasen, kan du prøve Ubiq. Vi tilbyder en 14-dages gratis prøveperiode.