如何编写含多个COUNT列的SQL查询?解决Error 1242子查询多行报错
解决SQL查询报错与多COUNT列实现问题
首先来说你遇到的报错原因:你的子查询select distinct patient.Gender from patient会返回所有不同的性别值(比如'M'、'F'这类),但=运算符只能匹配单个值,数据库没法确定要和哪一个性别值做匹配,所以就抛出了Error Code: 1242. Subquery returns more than 1 row这个错误。
其实你要统计性别对应的数量,根本不需要那个子查询,我们可以用更简单的写法来实现需求,分两种常用场景:
场景1:按性别分组,每行显示一个性别及其数量
这是最直观的分组统计写法,直接用GROUP BY按性别分组即可:
SELECT patient.Gender, COUNT(*) AS gender_count FROM patient GROUP BY patient.Gender;
执行后会返回类似这样的结果:
| Gender | gender_count |
|---|---|
| M | 45 |
| F | 52 |
场景2:多COUNT列,同一行显示不同性别的数量
如果希望把不同性别的统计结果放在同一行的不同列(比如男性数量、女性数量各占一列),可以用条件聚合的方式,在COUNT里结合CASE语句实现:
SELECT COUNT(CASE WHEN Gender = 'M' THEN 1 END) AS male_count, COUNT(CASE WHEN Gender = 'F' THEN 1 END) AS female_count, COUNT(*) AS total_patients -- 可选,用来统计总患者数 FROM patient;
这里的逻辑是:当性别匹配时,CASE返回1,否则返回NULL,而COUNT函数会自动忽略NULL值,从而精准统计对应性别的数量。执行后结果类似:
| male_count | female_count | total_patients |
|---|---|---|
| 45 | 52 | 97 |
如果你的性别字段还有其他可能的值(比如'Unknown'),只需要添加对应的CASE分支即可:
SELECT COUNT(CASE WHEN Gender = 'M' THEN 1 END) AS male_count, COUNT(CASE WHEN Gender = 'F' THEN 1 END) AS female_count, COUNT(CASE WHEN Gender = 'Unknown' THEN 1 END) AS unknown_gender_count, COUNT(*) AS total_patients FROM patient;
内容的提问来源于stack exchange,提问作者user14362299
相关产品推荐
相关产品推荐

