sql >> Databasteknik >  >> RDS >> Mysql

Hur fyller jag i saknade datum i MySQL?

Många gånger behöver vi fylla i saknade datum i MySQL-data genom att fylla i saknade rader för dessa datum. Så här fyller du i saknade datum och datumsekvensluckor för att skapa en korrekt försäljningsrapport som inte har några saknade rader.

Hur fyller man i saknade datum i MySQL?

Här är stegen för att fylla i saknade datum i MySQL. Låt oss säga att du har följande tabell försäljning(orderdatum, rea)

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 ovan finns det ingen data för många datum däremellan, såsom 2, 3 april, etc.

Om vi ​​försöker plotta dessa data på en graf kommer det att se ut ungefär som

En sådan graf kan vara missvisande eftersom den inte visar kolumnluckor för saknade datum.

Bonusläsning:SQL-fråga för att jämföra produktförsäljning per månad

För att fylla saknade datumrader i MySQL måste vi skapa en hjälptabell som innehåller alla nödvändiga datum, utan några sekvensluckor eller saknade datum och sedan sammanfoga den med vår försäljning bord.

Så här skapar du vår hjälptabell 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 |
+------------+

Det finns också en kortare väg för att skapa en kalendertabell, om du är bekväm med att använda lagrade 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 anropa denna funktion med funktionen CALL. För datumintervall från 1 till 30 april,

mysql> CALL fill_calendar('2020-04-01', '2020-04-31');

Bonus Läs:Hur man beräknar försäljning per månad i MySQL

Slutligen gör vi en VÄNSTER koppling av kalender tabell med försäljning för att fylla saknade datumrader 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 innehåller tabellen ovan alla datum, med försäljning för de rader där data finns och NULL för saknade datumrader.

Om du vill ersätta dessa NULL med 0, kan du använda 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 |
+------------+---------------------+

Bonus Läs:Hur man skapar dynamisk pivottabell i MySQL

När vi fyller i saknade datum i MySQL får vi även data för framtida datum. Om du också vill ta bort dessa extra 0 rader som finns i kalendern efter det senaste order_date du kan göra det med WHERE-satsen

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 fyllt i saknade datum i MySQL kan du använda ett rapportverktyg för att plotta denna data på ett stapeldiagram eller instrumentpanel och dela den med ditt team. Här är ett exempel på ett stapeldiagram som visar daglig försäljning, skapad med Ubiq.

Se skillnaden i 2 diagram!

Om du vill skapa diagram, instrumentpaneler och rapporter från MySQL-databasen kan du prova Ubiq. Vi erbjuder en 14-dagars gratis provperiod.

  1. Få det korta månadsnamnet i PostgreSQL

  2. Hur man installerar MySQL på CentOS 6

  3. Hur Trunc() fungerar i PostgreSQL

  4. En översikt över PostgreSQL Query Caching &Load Balancing