sql >> データベース >  >> RDS >> Mysql

MySQLで欠落している日付を埋める方法は?

    多くの場合、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日間の無料トライアルを提供しています。

    1. 一時テーブルなしでMySQLテーブル内のすべての重複レコードを削除するにはどうすればよいですか?

    2. SQL Serverで文字列のすべての出現箇所を別の文字列に置き換える方法– REPLACE()

    3. OracleMINUS演算子の説明

    4. 複数挿入SQLOracle