Dremel SQL中CASE WHEN多条件计数异常,求80-91区间正确统计方法
问题分析与解决方案
嘿,问题出在你写条件的方式上——SQL不支持像80 < x < 91这种连续比较的语法哦!
为什么原来的语句会返回总记录数?
在SQL里,80 < ROUND((offer_percent*100),1) < 91会被解析成(80 < ROUND((offer_percent*100),1)) < 91。而SQL会把布尔表达式的结果转换成数值:true是1,false是0。不管前面的比较结果是0还是1,它们都小于91,所以这个条件永远为真,自然就统计了所有符合id IN ($id)的记录,也就是总条数10。
修正后的查询语句
你需要用AND把两个比较条件分开,明确表达“大于80且小于91”的逻辑。另外,为了避免重复计算ROUND函数(提升效率),可以用子查询先处理百分比:
SELECT SUM(CASE WHEN rounded_percent > 90 THEN 1 ELSE 0 END) AS MoreThan90, SUM(CASE WHEN rounded_percent > 80 AND rounded_percent < 91 THEN 1 ELSE 0 END) AS LessThan90 FROM ( SELECT ROUND((offer_percent * 100), 1) AS rounded_percent FROM approval_state WHERE id IN ($id) ) AS subquery
如果不想用子查询,直接修改原语句的条件也可以:
SELECT SUM(CASE WHEN ROUND((offer_percent*100),1) > 90 THEN 1 ELSE 0 END) AS MoreThan90, SUM(CASE WHEN ROUND((offer_percent*100),1) > 80 AND ROUND((offer_percent*100),1) < 91 THEN 1 ELSE 0 END) AS LessThan90 FROM approval_state WHERE id IN ($id)
这样就能正确统计出你预期的2条记录啦。
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

