Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie füllt man fehlende Daten in MySQL aus?

Oft müssen wir fehlende Daten in MySQL-Daten füllen, indem wir fehlende Zeilen für diese Daten füllen. So füllen Sie fehlende Daten und Lücken in der Datumsfolge aus, um einen ordnungsgemäßen Verkaufsbericht ohne fehlende Zeilen zu erstellen.

Wie füllt man fehlende Daten in MySQL?

Hier sind die Schritte zum Ausfüllen fehlender Daten in MySQL. Nehmen wir an, Sie haben die folgende Tabelle sales(order_date, sale)

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 |
+------------+------+

Wie Sie in der obigen Tabelle sehen können, gibt es für viele dazwischen liegende Daten keine Daten, wie z. B. den 2. und 3. April usw.

Wenn wir versuchen, diese Daten in einem Diagramm darzustellen, sieht es in etwa so aus

Ein solches Diagramm kann irreführend sein, da es keine Spaltenlücken für fehlende Daten anzeigt.

Bonus-Lesetext:SQL-Abfrage zum Vergleich der Produktverkäufe nach Monat

Um fehlende Datumszeilen in MySQL zu füllen, müssen wir eine Hilfstabelle erstellen, die alle erforderlichen Daten enthält, ohne Sequenzlücken oder fehlende Daten, und sie dann mit unseren Verkäufen verbinden Tabelle.

So erstellen Sie unsere Hilfstabelle 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 |
+------------+

Es gibt auch einen kürzeren Weg um eine Kalendertabelle zu erstellen, wenn Sie mit der Verwendung gespeicherter Prozeduren vertraut sind.

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 ;

Sie können diese Funktion mit der CALL-Funktion aufrufen. Für den Zeitraum vom 1. bis 30. April

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

Bonuslektüre:So berechnen Sie den Umsatz pro Monat in MySQL

Schließlich machen wir einen LEFT Join von calendar Tabelle mit Verkäufen um fehlende Datumszeilen in MySQL zu füllen.

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 |
+------------+-----------+

Wie Sie sehen können, enthält die obige Tabelle alle Daten, mit Verkäufen für die Zeilen, in denen Daten vorhanden sind, und NULL für fehlende Datumszeilen.

Wenn Sie diese NULLen durch 0 ersetzen möchten, können Sie eine IFNULL-Funktion verwenden,

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 |
+------------+---------------------+

Bonuslektüre:So erstellen Sie eine dynamische Pivot-Tabelle in MySQL

Wenn wir fehlende Daten in MySQL ausfüllen, erhalten wir auch Daten für zukünftige Daten. Wenn Sie auch diese zusätzlichen 0 Zeilen entfernen möchten, die nach dem letzten order_date im Kalender vorhanden sind Sie können dies mit der WHERE-Klausel tun

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 |
+------------+---------------------+

Nachdem Sie fehlende Daten in MySQL ausgefüllt haben, können Sie diese Daten mit einem Berichterstellungstool in einem Balkendiagramm oder Dashboard darstellen und mit Ihrem Team teilen. Hier ist ein Beispiel für ein Balkendiagramm, das die täglichen Verkäufe zeigt und mit Ubiq erstellt wurde.

Sehen Sie den Unterschied in 2 Diagrammen!

Wenn Sie Diagramme, Dashboards und Berichte aus einer MySQL-Datenbank erstellen möchten, können Sie Ubiq ausprobieren. Wir bieten eine 14-tägige kostenlose Testversion an.