SQL计算SiteA员工目标达成与未达成人数比例 语法错误求助
错误排查
你写的SQL存在以下问题:
- 语法结构错误:没有外层
SELECT语句就直接对两个子查询执行JOIN操作,同时第二个子查询外层多了未闭合的左括号,导致语法报错 - 作用域错误:第一个子查询内部直接引用了第二个子查询的别名
d,该别名不在第一个子查询的可识别范围内 - 逻辑错误:不需要用FULL OUTER JOIN实现人数比值统计,你的查询逻辑完全偏离了先统计两类人数再计算比值的需求
正确实现方案
方案1:条件聚合(推荐,仅需一次表关联,执行效率最高)
SELECT CAST( SUM(CASE WHEN Target_status = 'Achieved' THEN 1 ELSE 0 END) AS FLOAT ) / SUM(CASE WHEN Target_status = 'Not Achieved' THEN 1 ELSE 0 END) AS achieve_ratio FROM Emp INNER JOIN Site ON Emp.EmployeeID = Site.EmpID WHERE Site.Site = 'SiteA';
执行后返回结果为1.5,即你需要的3/2的比值。
方案2:子查询分别统计(和你最初的思路更贴近)
SELECT CAST(achieve_count AS FLOAT) / not_achieve_count AS achieve_ratio FROM ( SELECT COUNT(*) AS achieve_count FROM Emp INNER JOIN Site ON Emp.EmployeeID = Site.EmpID WHERE Site.Site = 'SiteA' AND Emp.Target_status = 'Achieved' ) t_achieve, ( SELECT COUNT(*) AS not_achieve_count FROM Emp INNER JOIN Site ON Emp.EmployeeID = Site.EmpID WHERE Site.Site = 'SiteA' AND Emp.Target_status = 'Not Achieved' ) t_not_achieve;
注:如果你的数据库中
Target_status字段存在大小写不一致的情况,可以用UPPER(Target_status)或者LOWER(Target_status)统一转换后再做条件匹配,避免统计遗漏。
内容的提问来源于stack exchange,提问作者noob
相关产品推荐
相关产品推荐

