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

MySQL group byを使用して、その日にレコードがないときに空の値を埋める方法

    トリックを使用して、必要なすべての日付を持つ仮想テーブルを別のテーブルに生成できます(auxを置き換えます) DB内の任意のテーブルで少なくとも31が記録されています):

    SELECT CONVERT(@d := DATE_ADD(@d, INTERVAL 1 DAY), DATE) AS `d`
    FROM
        `aux`,
        (SELECT @d := DATE_SUB(CONVERT(DATE_FORMAT(NOW(), '%Y-%m-01'), DATETIME), INTERVAL 1 DAY)) `x`
    WHERE
        @d < DATE_SUB(NOW(), INTERVAL 1 DAY)
    LIMIT
        31
    

    そして、その上であなたのテーブルに参加します:

    SELECT
        `aux`.`d` as `Date`,
        SUM(IFNULL(`Clicks`, 0))AS `Clicks`,
        DAY(LAST_DAY(NOW())) AS `Monthdays`
    FROM (
        SELECT CONVERT(@d := DATE_ADD(@d, INTERVAL 1 DAY), DATE) AS `d`
        FROM
            `aux`,
            (SELECT @d := DATE_SUB(CONVERT(DATE_FORMAT(NOW(), '%Y-%m-01'), DATETIME), INTERVAL 1 DAY)) `x`
        WHERE
            @d < DATE_SUB(NOW(), INTERVAL 1 DAY)
        LIMIT
            31
    ) aux
    LEFT JOIN
        myTbl
        ON `Date` = `aux`.`d`
    GROUP BY `aux`.`d`
    



    1. SQLiteで指定された範囲内でランダムな数値を生成する方法

    2. PostgreSQLがpg_catalogテーブルからパーミッションを取り消す

    3. SQL標準UPSERT呼び出し

    4. ここで、1=1ステートメント