Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara mengisi tanggal yang hilang di MySQL?

Sering kali, kita perlu mengisi tanggal yang hilang dalam data MySQL, dengan mengisi baris yang hilang untuk tanggal tersebut. Berikut cara mengisi tanggal yang hilang dan celah urutan tanggal untuk membuat laporan penjualan yang benar tanpa ada baris yang hilang.

Bagaimana cara mengisi tanggal yang hilang di MySQL?

Berikut adalah langkah-langkah untuk mengisi tanggal yang hilang di MySQL. Katakanlah Anda memiliki tabel berikut penjualan(tanggal_pesanan, obral)

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

Seperti yang Anda lihat pada tabel di atas, tidak ada data untuk banyak tanggal di antaranya seperti 2, 3 April, dll.

Jika kita mencoba untuk memplot data ini pada grafik, itu akan terlihat seperti

Grafik seperti itu bisa menyesatkan karena tidak menunjukkan celah kolom untuk tanggal yang hilang.

Bonus Baca:SQL Query untuk Membandingkan Penjualan Produk Berdasarkan Bulan

Untuk mengisi baris tanggal yang hilang di MySQL, kita perlu membuat tabel pembantu yang berisi semua tanggal yang diperlukan, tanpa celah urutan atau tanggal yang hilang, lalu menggabungkannya dengan penjualan kita. tabel.

Berikut cara membuat tabel pembantu 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 |
+------------+

Ada juga jalan yang lebih pendek untuk membuat tabel kalender, jika Anda nyaman menggunakan prosedur tersimpan.

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 ;

Anda dapat memanggil fungsi ini menggunakan fungsi CALL. Untuk rentang tanggal dari 1 hingga 30 April,

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

Bonus Baca:Cara Menghitung Penjualan Per Bulan di MySQL

Akhirnya, kami melakukan gabungan KIRI kalender meja dengan penjualan untuk mengisi baris tanggal yang hilang di 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 |
+------------+-----------+

Seperti yang Anda lihat, tabel di atas berisi semua tanggal, dengan penjualan untuk baris yang berisi data dan NULL untuk baris tanggal yang hilang.

Jika Anda ingin mengganti NULL ini dengan 0, Anda dapat menggunakan fungsi 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 |
+------------+---------------------+

Bonus Baca :Cara Membuat Dynamic Pivot Table di MySQL

Saat kami mengisi tanggal yang hilang di MySQL, kami juga akan mendapatkan data untuk tanggal yang akan datang. Jika Anda juga ingin menghapus 0 baris tambahan ini yang ada di kalender setelah tanggal_pesanan terakhir Anda dapat melakukannya dengan klausa 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 |
+------------+---------------------+

Setelah Anda mengisi tanggal yang hilang di MySQL, Anda dapat menggunakan alat pelaporan untuk memplot data ini pada diagram batang atau dasbor dan membagikannya dengan tim Anda. Berikut adalah contoh diagram batang yang menunjukkan penjualan harian, dibuat menggunakan Ubiq.

Lihat perbedaannya dalam 2 grafik!

Jika Anda ingin membuat grafik, dasbor &laporan dari database MySQL, Anda dapat mencoba Ubiq. Kami menawarkan uji coba gratis selama 14 hari.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Migrasi Langsung Menggunakan Replikasi MySQL

  2. Perbedaan antara utf8 dan latin1

  3. Gunakan Database Relasional MySQL di Ubuntu 9.10 (Karmic)

  4. ROW_NUMBER() di MySQL

  5. Melarikan diri dari kartu liar MySQL