多くの場合、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 |
+------------+------+
上の表からわかるように、4月2日、3日など、その間の多くの日付のデータはありません。
このデータをグラフにプロットしようとすると、次のようになります
このようなグラフは、欠落している日付の列のギャップを示していないため、誤解を招く可能性があります。
ボーナスリード:月ごとの製品売上を比較するSQLクエリ
MySQLで欠落している日付の行を埋めるには、シーケンスのギャップや欠落している日付のない、必要なすべての日付を含むヘルパーテーブルを作成し、それを sales と結合する必要があります。 テーブル。
ヘルパーテーブルを作成する方法は次のとおりですカレンダー 。
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関数を使用して呼び出すことができます。 4月1日から30日までの日付範囲
mysql> CALL fill_calendar('2020-04-01', '2020-04-31');
ボーナスリード:MySQLで1か月あたりの売上を計算する方法
最後に、カレンダーの左結合を実行します 販売のあるテーブル 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で欠落している日付を入力すると、将来の日付のデータも取得されます。最新のorder_dateの後にカレンダーに存在するこれらの余分な0行も削除する場合 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を使用して作成された1日の売上を示す棒グラフの例です。
2つのグラフで違いを確認してください!
MySQLデータベースからチャート、ダッシュボード、レポートを作成したい場合は、Ubiqを試すことができます。 14日間の無料トライアルを提供しています。