SQL计数结果异常:使用count时查询结果不符的问题求助
问题分析与解答
咱们一步步拆解你的问题,就能明白为什么会出现这种看似矛盾的结果了。
首先,先看你的子查询 sq 会返回什么数据:
它把2016年和2017年同pa、pl、rp、corp的记录做了配对,最终得到4条配对结果:
rp1对应a1、a2两个corp,所以有2条记录rp2对应a1、a2两个corp,所以也有2条记录
接下来看外层查询的逻辑:group by pa, pl, rp 会把同一个rp的记录归为一组,再用having筛选出组内2017年平均评分比2016年高的分组。咱们先算两个分组的差值:
- rp1分组:2016年评分平均值是
(6+6.5)/2=6.25,2017年是(7+7.5)/2=7.25,差值为1>0,符合筛选条件,会被保留。 - rp2分组:2016年评分平均值是
(2+4)/2=3,2017年是(1.5+4.5)/2=3,差值为0,不满足>0的条件,会被过滤掉。
现在就能清楚两种select语句的差异了:
1. 当你写 select sq.rp 时
因为group by pa, pl, rp,每个分组只会返回一个rp值。只有rp1的分组通过了having筛选,所以结果只显示一行rp1。
2. 当你写 select count(sq.rp) 时
这里的count(sq.rp)是统计当前分组内的记录数量,而不是统计符合条件的rp的个数。rp1的分组里有2条记录(对应a1和a2两个corp),所以结果会返回一行值为2——这不是说有2个符合条件的rp,而是这个rp分组里有2条配对记录。
如果你想统计符合条件的rp的数量,应该把整个分组查询作为子查询,再在外层统计行数:
select count(*) from ( select l1.rp from list l1 join list l2 on l1.pa = l2.pa and l1.pl = l2.pl and l1.rp = l2.rp and l1.corp = l2.corp where l1.year = '2016' and l2.year = '2017' group by l1.pa, l1.pl, l1.rp having (avg(l2.rating)-avg(l1.rating)) > 0 ) as valid_rps
这个查询会返回1,也就是只有rp1符合条件。
内容的提问来源于stack exchange,提问作者kaushalpranav
相关产品推荐
相关产品推荐

