求助:如何用SQL统计2016年有1次及以上献血的学生人数
解决2016年有献血记录学生人数统计的SQL问题
嘿,别慌,卡一小时太正常了,我来帮你捋清楚问题出在哪~
你的原SQL语句有两个关键问题:
- 子查询里的
HAVING COUNT(*)>1条件错误:这个会只筛选出2016年献血超过1次的学生,但题目要求的是1次及以上,哪怕只献过1次的学生也应该被统计进去; - 外层多余的
GROUP BY StudID:这会让结果按学生ID分组,返回的是每个符合条件的学生对应的计数(每行都是1),而不是你要的总人数。
给你两种简单且正确的写法:
方法一:最直接的去重计数
SELECT COUNT(DISTINCT StudID) FROM DONA WHERE YEAR(DonDate) = 2016;
这个逻辑很清晰:先筛选出2016年的所有献血记录,然后对StudID去重后统计数量,就是有过献血记录的学生总数。
方法二:修正你的子查询写法
如果你想用分组的思路,也可以改成这样:
SELECT COUNT(*) FROM ( SELECT StudID FROM DONA WHERE YEAR(DonDate) = 2016 GROUP BY StudID ) AS student_list;
子查询会把2016年有献血记录的学生ID分组去重,得到一个唯一学生ID的列表;外层直接统计这个列表的行数,就是你要的总人数。
这样改完应该就能得到正确结果啦~
内容的提问来源于stack exchange,提问作者Ching To Jeremy Wong
相关产品推荐
相关产品推荐

