为什么SQL中CASE运算符与IF函数统计奥运会奖牌数结果不同?
问题原因解析
你对IF和CASE的基础认知没错,IF确实等价于单分支的CASE语句,两个查询结果不一致的原因和IF、CASE本身无关,是你第二个CASE语句的返回值写法不符合COUNT函数的统计逻辑。
1 COUNT函数的核心特性
COUNT(表达式)只会统计「表达式计算结果不为NULL」的行,表达式结果为NULL的行会被直接忽略。
2 第一个查询正确的原因
第一个查询里的IF(medal = "GOLD", medal, NULL),当奖牌不是对应类型时,返回值是NULL,刚好符合COUNT的忽略规则,所以最终统计的就是符合条件的对应奖牌行数,结果正确。
3 第二个查询错误的原因
你写的CASE语句case when MEDAL='GOLD' then '1' ELSE 0 end,不管当前行是不是对应类型的奖牌,返回值要么是字符串'1',要么是数字0,两个都是非NULL值,COUNT会把所有行都统计进去,最终结果就是该国家的所有奖牌记录总数,所以你会看到每个国家的三个奖牌数值都一样:ARG总共有1条奖牌记录所以三个值都是1,ARM有2条所以都是2,AUS有3条所以都是3。
4 CASE语句的正确写法
你只要把ELSE的返回值改成NULL,结果就和IF查询完全一致:
select NOC, count(case when MEDAL='GOLD' then 1 ELSE NULL end) as GOLD, count(case when MEDAL='SILVER' then 1 ELSE NULL end) as SILVER, count(case when MEDAL='BRONZE' then 1 ELSE NULL end) as BRONZE from olympics group by NOC
也可以换用SUM函数统计,此时ELSE返回0是正确的:
select NOC, sum(case when MEDAL='GOLD' then 1 ELSE 0 end) as GOLD, sum(case when MEDAL='SILVER' then 1 ELSE 0 end) as SILVER, sum(case when MEDAL='BRONZE' then 1 ELSE 0 end) as BRONZE from olympics group by NOC
内容的提问来源于stack exchange,提问作者Pranshu
相关产品推荐
相关产品推荐

