如何在SQL事件中嵌入聚合函数 实现疫苗接种数据每日自动统计
错误原因
- 语法混用:
VALUES关键字仅支持插入常量值列表,不能直接跟COUNT()这类聚合查询逻辑,你错误混合了INSERT ... VALUES和INSERT ... SELECT两种插入语法 - 逻辑错误:拆分两次
INSERT会生成两行不完整的记录,一行只有统计时间、一行只有接种人数,不符合将两个字段存入同一条记录的需求 - 调度规则错误:现有
ON SCHEDULE AT ...配置仅会触发一次事件,无法实现每日定时执行的需求
修正后的完整代码
SET GLOBAL event_scheduler = ON; CREATE TABLE IF NOT EXISTS vaccinated_tally( ID INT NOT NULL AUTO_INCREMENT, last_update TIMESTAMP, fully_vaccinated_tally INT, PRIMARY KEY (ID)); DELIMITER // CREATE EVENT IF NOT EXISTS daily_tally -- 配置为每天0点执行,可修改STARTS后的时间自定义执行时点 ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(CURDATE(), INTERVAL 1 DAY) ON COMPLETION PRESERVE ENABLE DO BEGIN INSERT INTO vaccinated_tally(last_update, fully_vaccinated_tally) SELECT NOW(), COUNT(pvh.nhs_number) FROM patient_vaccine_history pvh WHERE pvh.dose = 2; END// DELIMITER ;
改动说明
- 合并了两次插入操作为一次
INSERT ... SELECT语句,直接将时间戳和统计结果作为查询结果插入目标表,不需要VALUES关键字,解决COUNT用法报错的问题 - 调整事件调度规则为每日循环执行,默认执行时间为每天0点,你可以根据需求修改
STARTS后的时间参数自定义执行时点 - 增加了
IF NOT EXISTS配置,避免表、事件重复创建时报错 - 增加
ON COMPLETION PRESERVE配置,保证事件执行后不会自动删除,持续循环触发
内容的提问来源于stack exchange,提问作者bethfm
相关产品推荐
相关产品推荐

