SQL两次JOIN关联多表时统计结果占总数量百分比的计算问题
SQL需求问题修正方案
现有代码存在的问题
- 过滤条件错误:WHERE子句中Drive_Type筛选值写为
"Automatic"(自动挡),但需求是统计Stick shift(手动挡)的福特车辆持有量 - 语法错误:子查询计算总关联记录数的部分缺少右括号,会直接触发语法报错
- 字段冗余:SELECT列表中包含了Drive_Type字段,不符合预期输出的字段要求
- 整数除法兼容问题:部分数据库(如MySQL、SQL Server)默认整数相除会截断小数位,直接计算会得到0的错误结果
- 格式不匹配:未对计算结果拼接
%符号,和预期输出格式不符
修正后的SQL语句
SELECT c.name, COUNT(u.Drive_Type) AS Total, CONCAT(ROUND(COUNT(u.Drive_Type) * 100.0 / ( SELECT COUNT(*) FROM `User` u JOIN Join_bridge jb ON u.ID = jb.user_ID JOIN Car c ON c.car_ID = jb.car_has_ID ), 0), '%') AS percentage FROM `User` u JOIN Join_bridge jb ON u.ID = jb.user_ID JOIN Car c ON c.car_ID = jb.car_has_ID WHERE c.name = 'Ford' AND u.Drive_Type = 'Stick shift' GROUP BY c.name;
逻辑说明
- 对SQL关键字
User用反引号包裹,避免语法冲突 - 修正Drive_Type筛选值为
Stick shift匹配统计需求 - 调整计算顺序,先乘100.0触发浮点运算,避免整数除法导致的结果错误
- 使用ROUND函数保留整数位后拼接
%符号,完全匹配预期输出格式 - 增加GROUP BY分组规则,兼容SQL严格模式的语法校验要求
内容的提问来源于stack exchange,提问作者matt_lnrd
相关产品推荐
相关产品推荐

