記事ディレクトリ
序章
場合によっては、作業中にデータをクエリする必要がある場合があります。つまり、過去 1 か月またはその他の期間のすべてのレコードまたはグループ化されたデータを毎日カウントする必要があります。データがない場合は、自動的に入力されます。 0で。
通常の状況では、データのない時間をフィルタリングしますが、フロントエンドがバックエンドから返されたデータを取得し、継続的なデータの変更を直接表示したい場合は、再処理する必要があります。 SQL ステートメントによる要求。
アイデア分析
- 毎日データを取得できる場合は、最も単純なクエリを直接使用して時間を節約できます。
- 毎日の日付を表示するには、接続テーブルとして日付仮想テーブルを作成する必要があります。
- 日次データを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 ステートメントですが、月や年などの他の期間やその他のグループ化条件については、パラメータを直接変更して結果をクエリすることができます。