重複の可能性:
MySQL 範囲内の欠落している日付を埋める方法は?
次の列を持つテーブルがあります。
id
、submitdate
、clicks
.
ここで、31 日から 1 日あたりのクリック数を取得したいと考えています。
特定の日付に記録がない場合は、ゼロにする必要があります。
重複の可能性:
MySQL 範囲内の欠落している日付を埋める方法は?
次の列を持つテーブルがあります。
id
、submitdate
、clicks
.ここで、31 日から 1 日あたりのクリック数を取得したいと考えています。
特定の日付に記録がない場合は、ゼロにする必要があります。
これを試して:
SELECT
DATE(submitdate) 'Day',
SUM(clicks)
FROM Table
WHERE DATEDIFF(NOW(), submitdate) <= 31
GROUP BY DATE(submitdate);
更新:このためには、現在の日付から過去 n 日間のリストを生成する必要がありますNOW()
。私はこれにアンカーテーブルを使用しました:
CREATE TABLE TEMP
(Digit int);
INSERT INTO Temp VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
次に、それを使用して、今から n 日間のリストを生成しました (デモでは 31 日間を使用しましたが、100 未満の任意の値で試すことができます。100 を超える値を取得したい場合は、CROSS JOIN temp
もう 1 つテーブルを作成する必要があります)時間) 次のクエリを使用しました。
SELECT
DATE_SUB(NOW(), INTERVAL id DAY) GDay
FROM
(
SELECT t2.digit * 10 + t1.digit + 1 AS id
FROM TEMP AS t1
CROSS JOIN TEMP AS t2
) t WHERE id <= 31;
次にLEFT JOIN
、過去 31 日間を取得できます。レコードがない場合は、代わりに 0 になります。
SELECT
DATE(t2.GDay) 'Day',
SUM(IFNULL(t1.clicks, 0)) 'Count of clicks'
FROM
(
SELECT
DATE_SUB(NOW(), INTERVAL id DAY) GDay
FROM
(
SELECT t2.digit * 10 + t1.digit + 1 AS id
FROM TEMP AS t1
CROSS JOIN TEMP AS t2
) t WHERE id <= 31
) t2
LEFT JOIN Table1 t1 ON DATE(t1.submitdate) = DATE(t2.GDay)
GROUP BY DATE(t2.GDay)
ORDER BY DAY DESC;