Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để điền ngày còn thiếu trong MySQL?

Nhiều lần, chúng ta cần điền các ngày còn thiếu trong dữ liệu MySQL, bằng cách điền các hàng còn thiếu cho những ngày đó. Dưới đây là cách điền vào các ngày còn thiếu và khoảng trống trình tự ngày để tạo báo cáo bán hàng thích hợp không có bất kỳ hàng nào bị thiếu.

Làm cách nào để điền ngày bị thiếu trong MySQL?

Dưới đây là các bước để điền ngày còn thiếu trong MySQL. Giả sử bạn có bảng sau doanh số bán hàng (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 |
+------------+------+

Như bạn có thể thấy trong bảng trên, không có dữ liệu cho nhiều ngày giữa các ngày, chẳng hạn như ngày 2 tháng 4, ngày 3 tháng 4, v.v.

Nếu chúng tôi cố gắng vẽ dữ liệu này trên biểu đồ, nó sẽ trông giống như

Biểu đồ như vậy có thể gây hiểu lầm vì nó không hiển thị khoảng trống cột cho những ngày bị thiếu.

Phần thưởng Đọc:Truy vấn SQL để so sánh doanh số bán sản phẩm theo tháng

Để lấp đầy các hàng ngày còn thiếu trong MySQL, chúng tôi sẽ cần tạo một bảng trợ giúp có chứa tất cả các ngày bắt buộc, không có bất kỳ khoảng trống trình tự hoặc ngày bị thiếu nào và sau đó kết hợp nó với doanh số bán hàng của chúng tôi bảng.

Đây là cách tạo bảng lịch trợ giúp của chúng tôi .

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

Ngoài ra còn có một cách ngắn hơn để tạo bảng lịch, nếu bạn cảm thấy thoải mái với việc sử dụng các thủ tục được lưu trữ.

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 ;

Bạn có thể gọi hàm này bằng cách sử dụng hàm CALL. Trong phạm vi ngày từ ngày 1 đến ngày 30 tháng 4,

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

Phần thưởng đã đọc:Cách tính doanh số bán hàng mỗi tháng trong MySQL

Cuối cùng, chúng tôi kết hợp TRÁI của lịch bảng có doanh số bán hàng để điền vào các hàng ngày còn thiếu trong 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 |
+------------+-----------+

Như bạn có thể thấy, bảng trên chứa tất cả các ngày, với doanh số cho những hàng có dữ liệu và NULL cho các hàng ngày bị thiếu.

Nếu bạn muốn thay thế các NULL này bằng 0, bạn có thể sử dụng hàm 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 |
+------------+---------------------+

Phần thưởng đọc:Cách tạo Bảng Pivot động trong MySQL

Khi chúng tôi điền các ngày còn thiếu trong MySQL, chúng tôi cũng sẽ nhận được dữ liệu cho các ngày trong tương lai. Nếu bạn cũng muốn xóa 0 hàng thừa này có trong lịch sau order_date mới nhất bạn có thể làm như vậy với mệnh đề 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 |
+------------+---------------------+

Sau khi điền các ngày còn thiếu trong MySQL, bạn có thể sử dụng công cụ báo cáo để vẽ dữ liệu này trên biểu đồ thanh hoặc trang tổng quan và chia sẻ nó với nhóm của bạn. Dưới đây là ví dụ về biểu đồ thanh hiển thị doanh số hàng ngày, được tạo bằng Ubiq.

Hãy xem sự khác biệt trong 2 biểu đồ!

Nếu bạn muốn tạo biểu đồ, trang tổng quan và báo cáo từ cơ sở dữ liệu MySQL, bạn có thể thử Ubiq. Chúng tôi cung cấp bản dùng thử miễn phí 14 ngày.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách kết hợp nhiều dòng thành một cột trong MySQL

  2. Hàm mật khẩu MySQL

  3. Nâng cao tiêu chuẩn về quản lý MySQL, MariaDB, PostgreSQL &MongoDB

  4. Người dùng hiển thị MySQL

  5. Cách giám sát ProxySQL của bạn với Prometheus và ClusterControl