You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CASE语句标记仅出现一次的国家为Other时查询异常求助

解决CASE语句标记单次出现国家的问题

嗨,我来帮你搞定这个SQL问题!你的查询思路方向是对的,但核心问题出在子查询没有和外层表关联,导致无法针对每一行对应的国家计算其出现次数,才会出现所有国家都被标记为"Other"的情况。

正确的解决方案有两种,你可以根据自己的数据库版本选择:

方法1:关联子查询(兼容所有数据库)

给外层表起别名,在子查询里过滤出和当前行相同的国家,这样就能准确计算每个国家的出现次数:

SELECT 
    CASE 
        WHEN (SELECT COUNT(*) FROM customer c2 WHERE c2.country = c1.country) = 1 THEN 'Other'
        ELSE c1.country 
    END AS country
FROM customer c1;

方法2:窗口函数(推荐,性能更优)

如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),用COUNT() OVER (PARTITION BY country)可以一次性计算每个国家的出现次数,效率更高:

SELECT 
    CASE 
        WHEN COUNT(*) OVER (PARTITION BY country) = 1 THEN 'Other'
        ELSE country 
    END AS country
FROM customer;

原查询的错误原因

你原来写的子查询(SELECT COUNT(country) FROM customer GROUP BY country)会返回所有国家的计数列表(比如如果有3个不同国家,就返回3个数字),当你直接和1比较时,数据库无法将这个列表和当前行的国家对应起来,逻辑判定出现混乱,最终导致所有行都被错误标记为"Other"。

内容的提问来源于stack exchange,提问作者James Duck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:18:11