Wiele razy musimy uzupełnić brakujące daty w danych MySQL, wypełniając brakujące wiersze dla tych dat. Oto jak uzupełnić brakujące daty i luki w sekwencji dat, aby utworzyć odpowiedni raport sprzedaży, który nie zawiera brakujących wierszy.
Jak wypełnić brakujące daty w MySQL?
Oto kroki, aby uzupełnić brakujące daty w MySQL. Załóżmy, że masz następującą tabelę sprzedaż(data_zamówienia, sprzedaż)
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 | +------------+------+
Jak widać w powyższej tabeli, nie ma danych dla wielu dat pomiędzy, takich jak 2, 3 kwietnia itd.
Jeśli spróbujemy wykreślić te dane na wykresie, będzie to wyglądać mniej więcej
Taki wykres może wprowadzać w błąd, ponieważ nie pokazuje przerw w kolumnach dla brakujących dat.
Przeczytaj bonus:Zapytanie SQL do porównania sprzedaży produktów według miesiąca
Aby wypełnić brakujące wiersze dat w MySQL, musimy utworzyć tabelę pomocniczą zawierającą wszystkie wymagane daty, bez przerw w sekwencji lub brakujących dat, a następnie połączyć ją z naszą sprzedażą tabela.
Oto jak utworzyć naszą tabelę pomocniczą kalendarz .
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 | +------------+
Istnieje również krótsza droga aby utworzyć tabelę kalendarza, jeśli nie masz nic przeciwko używaniu procedur składowanych.
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 ;
Możesz wywołać tę funkcję za pomocą funkcji WYWOŁAJ. Dla zakresu dat od 1 kwietnia do 30,
mysql> CALL fill_calendar('2020-04-01', '2020-04-31');
Przeczytaj bonus:Jak obliczyć sprzedaż miesięczną w MySQL
Na koniec wykonujemy LEWE złączenie kalendarza tabela ze sprzedażą aby wypełnić brakujące wiersze dat w 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 | +------------+-----------+
Jak widać, powyższa tabela zawiera wszystkie daty, ze sprzedażą dla tych wierszy, w których obecne są dane i NULL dla brakujących wierszy dat.
Jeśli chcesz zastąpić te NULL wartościami 0, możesz użyć funkcji IFNULL,
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 | +------------+---------------------+
Przeczytaj bonus:Jak stworzyć dynamiczną tabelę przestawną w MySQL
Gdy uzupełnimy brakujące daty w MySQL, otrzymamy również dane na przyszłe daty. Jeśli chcesz również usunąć te dodatkowe 0 wierszy, które są obecne w kalendarzu po ostatniej data_zamówienia możesz to zrobić za pomocą klauzuli WHERE
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 | +------------+---------------------+
Po uzupełnieniu brakujących dat w MySQL możesz użyć narzędzia do raportowania, aby wykreślić te dane na wykresie słupkowym lub pulpicie nawigacyjnym i udostępnić je swojemu zespołowi. Oto przykład wykresu słupkowego przedstawiającego dzienną sprzedaż, utworzonego za pomocą Ubiq.
Zobacz różnicę na 2 wykresach!
Jeśli chcesz tworzyć wykresy, dashboardy i raporty z bazy danych MySQL, możesz wypróbować Ubiq. Oferujemy 14-dniowy bezpłatny okres próbny.