SQL按response字段划分区间统计时所有记录均归入0-5区间问题排查
错误原因
- 核心问题出在
GROUP BY 'range'这一行:SQL中单引号用于标识字符串字面量,你这里用单引号包裹别名range,数据库会认为你要按照固定的字符串常量'range'做分组,所有行都属于同一个分组,不会按你计算出的区间值拆分统计。 - 在未开启
ONLY_FULL_GROUP_BY模式的MySQL环境下,分组后SELECT的CASE结果会默认取分组内第一行的计算值,所以才会出现所有119条记录都被统计到第一个区间的异常结果。
修正方案
把GROUP BY后的单引号去掉,使用反引号包裹别名(避免和SQL保留关键字range冲突)即可,修正后的SQL如下:
SELECT CASE WHEN response BETWEEN 0 AND 5 then '0 - 5' WHEN response BETWEEN 6 AND 10 then '6 - 10' else 'over 10' end AS `range`, COUNT(*) as `count` FROM( SELECT datediff(MIN(referral_interventions.dateOfintervention), referral.referralDate) as response from referral LEFT JOIN referral_interventions on referral.refid =referral_interventions.refID LEFT JOIN interventions on referral_interventions.typeOfintervention = interventions.intid WHERE referral.referralDate > '2021-11-01' GROUP BY referral.refid ) AS tempdiff GROUP BY `range`;
补充说明
range和count都属于SQL的保留关键字,作为别名使用时建议用反引号(MySQL)或者双引号(PostgreSQL、SQL Server等标准SQL环境)包裹,避免不必要的语法冲突。
内容的提问来源于stack exchange,提问作者Glen McCabe
相关产品推荐
相关产品推荐

