MySQL中连续某月日期内数据统计,缺省天数0补全

总共有两种方式

第一种数据库表中数据的总数没有限制

SELECT t1.updateTime, COALESCE(t2.count, 0) as count
FROM( SELECT ADDDATE(y.first, x.d - 1) as updateTime FROM
(
SELECT 1 AS d UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7 UNION ALL
SELECT 8 UNION ALL
SELECT 9 UNION ALL
SELECT 10 UNION ALL
SELECT 11 UNION ALL
SELECT 12 UNION ALL
SELECT 13 UNION ALL
SELECT 14 UNION ALL
SELECT 15 UNION ALL
SELECT 16 UNION ALL
SELECT 17 UNION ALL
SELECT 18 UNION ALL
SELECT 19 UNION ALL
SELECT 20 UNION ALL
SELECT 21 UNION ALL
SELECT 22 UNION ALL
SELECT 23 UNION ALL
SELECT 24 UNION ALL
SELECT 25 UNION ALL
SELECT 26 UNION ALL
SELECT 27 UNION ALL
SELECT 28 UNION ALL
SELECT 29 UNION ALL
SELECT 30 UNION ALL
SELECT 31
) x,
(
SELECT ‘2019-12-01’ - INTERVAL DAY(‘2019-12-01’) - 1 DAY AS first,
DAY(LAST_DAY(‘2019-12-01’)) AS last) y
WHERE x.d <= y.last
) t1
LEFT JOIN(

	SELECT count(1) count ,pr.distinct_date 
             from patrol_report pr left join village_community vc on pr.community_id = vc.id  where 1=1 and pr.community_id = '123' and pr.update_time like '%2019-12%'  GROUP BY pr.distinct_date  

) t2
on t1.updateTime = t2.distinct_date ORDER BY updateTime

第二种数据库表中数据应该首先插入31条数据(保证不少于31条),否则只会显示当前日期前面的数据。

SELECT t1.date_str, COALESCE(t2.count, 0) as date_total_count
FROM(
SELECT
@num:=@num+1 num,
DATE_ADD(DATE_FORMAT(‘2019-12-01’, ‘%Y-%m-%d’),INTERVAL @num DAY) as date_str
FROM
patrol_report a,
(select @num:=-1) num_t
WHERE
@num < (SELECT DAYOFMONTH(LAST_DAY(‘2019-12-01’)) - 1)
) t1
LEFT JOIN(

	SELECT count(1) count ,pr.distinct_date 
             from patrol_report pr left join village_community vc on pr.community_id = vc.id  where 1=1 GROUP BY pr.distinct_date  

) t2
on t1.date_str = t2.distinct_date ORDER BY date_str

标题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过生成一个连续日期序列,然后使用左连接(LEFT JOIN)把日期序列和原始表格连接起来,再使用 IFNULL 函数把空值替换成 0,最后使用 UPDATE 语句更新原始表格。以下是具体的 SQL 代码: 假设原始表格名称为 `my_table`,日期字段名称为 `date_field`,数据字段名称为 `data_field`。 1. 生成连续日期序列 首先,我们需要生成一个连续日期序列。可以使用以下 SQL 语句: ``` SELECT date_sequence.date FROM ( SELECT DATE_SUB( DATE(NOW()), INTERVAL n DAY) AS date FROM ( SELECT a.N + b.N * 10 + 1 AS n FROM ( SELECT 0 AS N 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 ) AS a CROSS JOIN ( SELECT 0 AS N 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 ) AS b ) AS numbers WHERE DATE_SUB(DATE(NOW()), INTERVAL n DAY) >= '2021-01-01' ) AS date_sequence ``` 这个 SQL 语句可以生成从当前日期往前数 365 天的连续日期序列。如果需要生成更长的日期序列,可以调整 `WHERE` 子句日期范围。 2. 连接原始表格和日期序列 接下来,我们使用左连接把原始表格和日期序列连接起来: ``` SELECT date_sequence.date, my_table.data_field FROM ( SELECT date_sequence.date FROM ( SELECT DATE_SUB( DATE(NOW()), INTERVAL n DAY) AS date FROM ( SELECT a.N + b.N * 10 + 1 AS n FROM ( SELECT 0 AS N 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 ) AS a CROSS JOIN ( SELECT 0 AS N 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 ) AS b ) AS numbers WHERE DATE_SUB(DATE(NOW()), INTERVAL n DAY) >= '2021-01-01' ) AS date_sequence LEFT JOIN my_table ON date_sequence.date = my_table.date_field ) ``` 这个 SQL 语句会生成一个包含日期序列和原始表格数据的临时表格。 3. 替换空值为 0 现在,我们可以使用 `IFNULL` 函数把空值替换成 0: ``` SELECT date_sequence.date, IFNULL(my_table.data_field, 0) AS data_field FROM ( SELECT date_sequence.date FROM ( SELECT DATE_SUB( DATE(NOW()), INTERVAL n DAY) AS date FROM ( SELECT a.N + b.N * 10 + 1 AS n FROM ( SELECT 0 AS N 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 ) AS a CROSS JOIN ( SELECT 0 AS N 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 ) AS b ) AS numbers WHERE DATE_SUB(DATE(NOW()), INTERVAL n DAY) >= '2021-01-01' ) AS date_sequence LEFT JOIN my_table ON date_sequence.date = my_table.date_field ) AS temp_table ``` 这个 SQL 语句会生成一个包含日期序列和数据字段的临时表格,其缺失的日期对应的数据字段值会被替换成 0。 4. 更新原始表格 最后,我们使用 `UPDATE` 语句更新原始表格: ``` UPDATE my_table INNER JOIN ( SELECT date_sequence.date, IFNULL(my_table.data_field, 0) AS data_field FROM ( SELECT date_sequence.date FROM ( SELECT DATE_SUB( DATE(NOW()), INTERVAL n DAY) AS date FROM ( SELECT a.N + b.N * 10 + 1 AS n FROM ( SELECT 0 AS N 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 ) AS a CROSS JOIN ( SELECT 0 AS N 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 ) AS b ) AS numbers WHERE DATE_SUB(DATE(NOW()), INTERVAL n DAY) >= '2021-01-01' ) AS date_sequence LEFT JOIN my_table ON date_sequence.date = my_table.date_field ) AS temp_table ) AS new_data ON my_table.date_field = new_data.date SET my_table.data_field = new_data.data_field; ``` 这个 SQL 语句会使用临时表格数据更新原始表格数据。注意,这个 SQL 语句只会更新日期序列存在的日期对应的数据字段,日期序列缺失的日期对应的数据字段值不会被更新。如果需要更新所有日期对应的数据字段值,可以在第三步使用 `COALESCE` 函数把空值替换成 0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值