SQL查询求助:获取近一年医疗事故超2次的医生信息失败
问题出在哪?
嘿,我来帮你捋清楚这个问题~你现在遇到的核心问题是GROUP BY的使用逻辑跑偏了。当你把Malpractice_date和Malpractice_desc加到SELECT里时,GROUP BY会把每一条单独的医疗事故记录当成一个独立分组(毕竟每个事故的日期和描述都不一样),这时候每个分组的事故数量都是1,自然达不到“超过2次”的要求,所以查询就返回空结果啦。
正确的解决思路
咱们得换个方式:先找出那些近一年医疗事故超过2次的医生,再关联回原表,把这些医生的所有事故详情拉出来。给你两种常用的实现方式:
方式1:用子查询先筛医生
SELECT S.STAFF_ID, S.firstname, S.lastname, M.Malpractice_date, M.Malpractice_desc FROM STAFF S INNER JOIN MALPRACTICE M ON S.STAFF_ID = M.DOCTOR_ID WHERE -- 用动态日期代替固定值,不用每年手动改 M.Malpractice_date >= DATEADD(year, -1, GETDATE()) AND M.DOCTOR_ID IN ( -- 先找出近一年事故≥2次的医生ID SELECT DOCTOR_ID FROM MALPRACTICE WHERE Malpractice_date >= DATEADD(year, -1, GETDATE()) GROUP BY DOCTOR_ID HAVING COUNT(*) > 2 ) -- 按医生ID和事故日期排序,看起来更清晰 ORDER BY S.STAFF_ID, M.Malpractice_date;
方式2:用CTE(公共表表达式)更直观
如果你的数据库支持CTE(比如SQL Server、PostgreSQL、MySQL 8+),这种写法可读性更强:
-- 先定义一个临时数据集,存符合条件的医生 WITH HighRiskDoctors AS ( SELECT DOCTOR_ID FROM MALPRACTICE WHERE Malpractice_date >= DATEADD(year, -1, GETDATE()) GROUP BY DOCTOR_ID HAVING COUNT(*) > 2 ) SELECT S.STAFF_ID, S.firstname, S.lastname, M.Malpractice_date, M.Malpractice_desc FROM STAFF S INNER JOIN MALPRACTICE M ON S.STAFF_ID = M.DOCTOR_ID -- 关联刚才筛选出的高风险医生 INNER JOIN HighRiskDoctors H ON M.DOCTOR_ID = H.DOCTOR_ID ORDER BY S.STAFF_ID, M.Malpractice_date;
小细节调整
- 如果用的是MySQL,把
GETDATE()换成CURDATE(),日期计算改成DATE_SUB(CURDATE(), INTERVAL 1 YEAR)就行。 - 用动态日期代替你写的固定
'01/01/2017',这样每年都不用手动修改查询,更省心。
内容的提问来源于stack exchange,提问作者KupKakeKiller
相关产品推荐
相关产品推荐

