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

存在しないデータに対して空の行を返す

    次のようなことができます:

    # table creation:
    
    drop table if exists test_table;
    
    create table test_table (your_date date, your_value int(11));
    insert into test_table (your_date, your_value) values ('2020-01-01', 1);
    insert into test_table (your_date, your_value) values ('2020-01-01', 2);
    insert into test_table (your_date, your_value) values ('2020-01-03', 2);
    insert into test_table (your_date, your_value) values ('2020-01-07', 3);
    insert into test_table (your_date, your_value) values ('2020-01-08', 4);
    insert into test_table (your_date, your_value) values ('2020-01-08', 1);
    

    これにより、基本的にすべての日付のリストが作成されます。次に、興味のある日付をフィルタリングし、テーブルとグループに参加します。

    whereステートメントの日付をサブクエリ(テーブルの最小および最大の日付)に置き換えて、動的にすることもできます

    少し回避策ですが、機能します。

    select sbqry.base_date, sum(ifnull(t.your_value, 0))
    from (select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) base_date from
        (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
        (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
        (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
        (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
        (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) sbqry
    left join test_table t on base_date = t.your_date
    where sbqry.base_date between '2020-01-01' and '2020-01-08'
    group by sbqry.base_date;
    

    入力:

    +------------+------------+
    | your_date  | your_value |
    +------------+------------+
    | 2020-01-01 |          1 |
    | 2020-01-01 |          2 |
    | 2020-01-03 |          2 |
    | 2020-01-07 |          3 |
    | 2020-01-08 |          4 |
    | 2020-01-08 |          1 |
    +------------+------------+
    

    出力:

    +------------+------------------------------+
    | base_date  | sum(ifnull(t.your_value, 0)) |
    +------------+------------------------------+
    | 2020-01-01 |                            3 |
    | 2020-01-02 |                            0 |
    | 2020-01-03 |                            2 |
    | 2020-01-04 |                            0 |
    | 2020-01-05 |                            0 |
    | 2020-01-06 |                            0 |
    | 2020-01-07 |                            3 |
    | 2020-01-08 |                            5 |
    +------------+------------------------------+
    


    1. MySQLで月の名前で注文する方法

    2. Hibernateスキームの命名はOS間で異なります

    3. T-SQLを使用してSQLServerデータベースのリカバリモデルを変更する方法

    4. MySQLiを使用してデータベースにデータを挿入する