MySQLは一定期間内のデータを日ごとにカウントし、データがない場合は0を埋めます。

序章

       場合によっては、作業中にデータをクエリする必要がある場合があります。つまり、過去 1 か月またはその他の期間のすべてのレコードまたはグループ化されたデータを毎日カウントする必要があります。データがない場合は、自動的に入力されます。 0で。

       通常の状況では、データのない時間をフィルタリングしますが、フロントエンドがバックエンドから返されたデータを取得し、継続的なデータの変更を直接表示したい場合は、再処理する必要があります。 SQL ステートメントによる要求。

アイデア分析

  1. 毎日データを取得できる場合は、最も単純なクエリを直接使用して時間を節約できます。
  2. 毎日の日付を表示するには、接続テーブルとして日付仮想テーブルを作成する必要があります。
  3. 日次データをnullにしないようにするには、IFNULL(count,0)ゼロ埋めするかどうかを判定する関数を使用します。

SQLの実装

以下は、過去 1 か月の日次データをクエリして SQL 実装を示す例です。

日ごとの統計

1. データのない日をフィルタリングする

SELECT DATE(CREATE_DATE) as date, COUNT(1) as count
FROM 表
WHERE 字段 = '1'
  AND DATE_FORMAT(CREATE_DATE, '%Y-%m-%d') >=
      DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 30 DAY), '%Y-%m-%d')
GROUP BY DATE(CREATE_DATE);

検索結果:

ここに画像の説明を挿入

2. データのない合計日数は null です

SELECT DATE_FORMAT(date,'%Y-%m-%d') AS date,data.num AS count
FROM (
         SELECT @days := DATE_ADD(@days, INTERVAL - 1 DAY) AS date
         FROM (SELECT @days := DATE_ADD(CURDATE(), INTERVAL + 1 DAY)
               FROM 表
              ) day
         WHERE DATE_FORMAT(@days, '%Y-%m-%d') >=
               DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 29 DAY), '%Y-%m-%d')
         ORDER BY date
     ) dates
         LEFT JOIN (
    SELECT  COUNT(1) AS num, DATE(CREATE_DATE) AS time
    FROM audit_work_sheet
    WHERE 字段 = '1'
      AND DATE_FORMAT(CREATE_DATE, '%Y-%m-%d %H:%i:%S') >=
          DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 30 DAY), '%Y-%m-%d %H:%i:%S')
    GROUP BY DATE(CREATE_DATE)
) data ON DATE(time) = date
ORDER BY date;

検索結果:

ここに画像の説明を挿入

3. データのない日数の合計は 0 です。

SELECT DATE_FORMAT(date,'%Y-%m-%d') AS date,IFNULL(data.num, 0) AS count
FROM (
         SELECT @days := DATE_ADD(@days, INTERVAL - 1 DAY) AS date
         FROM (SELECT @days := DATE_ADD(CURDATE(), INTERVAL + 1 DAY)
               FROM 表
              ) day
         WHERE DATE_FORMAT(@days, '%Y-%m-%d') >=
               DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 29 DAY), '%Y-%m-%d')
         ORDER BY date
     ) dates
         LEFT JOIN (
    SELECT  COUNT(1) AS num, DATE(CREATE_DATE) AS time
    FROM audit_work_sheet
    WHERE 字段 = '1'
      AND DATE_FORMAT(CREATE_DATE, '%Y-%m-%d %H:%i:%S') >=
          DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 30 DAY), '%Y-%m-%d %H:%i:%S')
    GROUP BY DATE(CREATE_DATE)
) data ON DATE(time) = date
ORDER BY date;

検索結果

ここに画像の説明を挿入

4. 他のグループ化フィールドにデータがない合計日数は 0 です。

SELECT DATE_FORMAT(date,'%Y-%m-%d') AS date,data.level AS level, IFNULL(data.num, 0) AS count
FROM (
         SELECT @days := DATE_ADD(@days, INTERVAL - 1 DAY) AS date
         FROM (SELECT @days := DATE_ADD(CURDATE(), INTERVAL + 1 DAY)
               FROM 表
              ) day
         WHERE DATE_FORMAT(@days, '%Y-%m-%d') >=
               DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 29 DAY), '%Y-%m-%d')
         ORDER BY date
     ) dates
         LEFT JOIN (
    SELECT RISK_LEVEL AS level, COUNT(1) AS num, DATE(CREATE_DATE) AS time
    FROM audit_work_sheet
    WHERE 字段 = '1'
      AND DATE_FORMAT(CREATE_DATE, '%Y-%m-%d %H:%i:%S') >=
          DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 30 DAY), '%Y-%m-%d %H:%i:%S')
    GROUP BY DATE(CREATE_DATE),level
) data ON DATE(time) = date
ORDER BY date,level;

検索結果

ここに画像の説明を挿入

(途中の余分なデータは表示されません)

上記は、日別の統計データのゼロ埋めを行わない SQL ステートメントですが、月や年などの他の期間やその他のグループ化条件については、パラメータを直接変更して結果をクエリすることができます。

おすすめ

転載: blog.csdn.net/qq_38951230/article/details/127443836