MySQL多表关联查询:筛选2017年接诊患者不足5人的医生
解决2017年接诊患者不足5人的医生列表SQL问题
嘿,我来帮你修正这个SQL语句,先说说你原语句里的几个关键问题:
- 分组字段选错了:你现在按
Pacienti_Idp(患者ID)分组,这会统计每个患者的就诊次数,而非每个医生的接诊情况 - 没过滤2017年的记录,会包含所有年份的数据
- 缺少分组后的筛选条件,没法过滤出数量不足5的医生
首先得明确需求:你说的“接诊患者数量”是指总就诊次数还是接诊的不同患者人数?我分别给你两种场景的写法:
场景1:统计2017年接诊不同患者数量不足5人的医生
这种场景是统计每个医生在2017年接诊了多少个不同的患者,筛选出人数<5的:
SELECT CONCAT(Nume, ' ', Prenume) AS 'Nume Medic', COUNT(DISTINCT Pacienti_Idp) AS 'Nr pacienti unici', YEAR(DataOra) AS An FROM medici INNER JOIN vizite ON medici.idm = vizite.medici_idm WHERE YEAR(DataOra) = 2017 GROUP BY medici.idm, Nume, Prenume, YEAR(DataOra) HAVING COUNT(DISTINCT Pacienti_Idp) < 5;
场景2:统计2017年总就诊次数不足5次的医生
如果是统计医生的总接诊次数(同一个患者多次就诊算多次),把COUNT(DISTINCT Pacienti_Idp)换成COUNT(*)即可:
SELECT CONCAT(Nume, ' ', Prenume) AS 'Nume Medic', COUNT(*) AS 'Nr vizite', YEAR(DataOra) AS An FROM medici INNER JOIN vizite ON medici.idm = vizite.medici_idm WHERE YEAR(DataOra) = 2017 GROUP BY medici.idm, Nume, Prenume, YEAR(DataOra) HAVING COUNT(*) < 5;
关键细节解释:
WHERE YEAR(DataOra) = 2017:先过滤出2017年的就诊记录,减少分组的数据量GROUP BY medici.idm, Nume, Prenume:必须按医生的主键idm分组(避免重名医生被错误合并),同时带上姓名字段才能在SELECT中调用HAVING:专门用来筛选分组后的聚合结果,因为WHERE不能直接使用COUNT()这类聚合函数
另外,如果要包含2017年没有接诊任何患者的医生,可以把INNER JOIN换成LEFT JOIN,并调整HAVING条件为COUNT(DISTINCT Pacienti_Idp) < 5 OR COUNT(DISTINCT Pacienti_Idp) IS NULL,不过看你的需求是“接诊患者数量不足5人”,默认用INNER JOIN统计有接诊记录的医生就足够啦。
内容的提问来源于stack exchange,提问作者gabi b
相关产品推荐
相关产品推荐

