Много пъти трябва да попълним липсващи дати в MySQL данни, като попълним липсващи редове за тези дати. Ето как да попълните липсващи дати и пропуски в последователността на датите, за да създадете правилен отчет за продажбите, в който няма липсващи редове.
Как да попълним липсващи дати в MySQL?
Ето стъпките за попълване на липсващи дати в MySQL. Да приемем, че имате следната таблица 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 | +------------+------+
Както можете да видите в таблицата по-горе, няма данни за много дати между тях, като 2, 3 април и т.н.
Ако се опитаме да начертаем тези данни на графика, тя ще изглежда нещо като
Такава графика може да бъде подвеждаща, тъй като не показва пропуски в колоните за липсващи дати.
Бонус за четене:SQL заявка за сравняване на продажбите на продукти по месец
За да попълним липсващите редове с дати в MySQL, ще трябва да създадем помощна таблица, която съдържа всички необходими дати, без никакви пропуски в последователността или липсващи дати и след това да я присъединим към нашите продажби таблица.
Ето как да създадете нашата помощна таблица календар .
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 | +------------+
Има и по-кратък път за да създадете календарна таблица, ако ви е удобно да използвате съхранени процедури.
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 ;
Можете да извикате тази функция с помощта на функцията CALL. За период от дати от 1 до 30 април,
mysql> CALL fill_calendar('2020-04-01', '2020-04-31');
Бонус прочетете:Как да изчислим продажбите на месец в MySQL
Накрая правим ЛЯВО присъединяване на календар таблица с продажби за да попълните липсващите редове с дата в 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 | +------------+-----------+
Както можете да видите, таблицата по-горе съдържа всички дати, с продажби за тези редове, където има данни, и NULL за липсващи редове с дата.
Ако искате да замените тези NULL с 0, можете да използвате функция 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 | +------------+---------------------+
Бонус за четене:Как да създадете динамична обобщена таблица в MySQL
Когато попълним липсващи дати в MySQL, ще получим и данни за бъдещи дати. Ако искате също да премахнете тези допълнителни 0 реда, които присъстват в календара след най-новата order_date можете да го направите с клауза 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 | +------------+---------------------+
След като попълните липсващите дати в MySQL, можете да използвате инструмент за отчитане, за да начертаете тези данни на лента или табло за управление и да ги споделите с вашия екип. Ето пример за лентова диаграма, която показва ежедневните продажби, създадена с Ubiq.
Вижте разликата в 2 диаграми!
Ако искате да създавате диаграми, табла за управление и отчети от MySQL база данни, можете да опитате Ubiq. Предлагаме 14-дневен безплатен пробен период.