SQL 中达到和未达到目标的比率

Ratio of target met and not met in SQL

Table Emp

EmployeeID   Target_status   
1           Achieved     
2           Not achieved  
5           Not Achieved  
6           Achieved      
3           Achieved      
4           Not Achieved  

Table 网站

  EmpID      Site
     1       SiteA
     2       SiteB
     3       SiteA
     4       SiteA
     5       SiteA
     6       SiteA

如何找到站点 A 中达到目标的人数与未达到目标的人数的比率(答案:3/2)

尝试过的代码:

(select cast(count(a.Target_status)/count(d.Target_status) as float) 
from Emp a
inner join Site b on a.EmployeeId = b.EmpId
where Site = 'SiteA' and a.Target_status='Achieved' ) e
full outer join
(
(select * from Emp a
inner join Site b on a.EmployeeId = b.EmpId
where Site = 'SiteA' and a.Target_status='Not Achieved' ) d

on e.employeeID=d.empid

错误:

Msg 156, Level 15, State 1, Line 9
Incorrect syntax near the keyword 'full'.
Msg 102, Level 15, State 1, Line 13
Incorrect syntax near 'd'.

谁能帮忙

您可以使用条件聚合:

SELECT 1.0 * SUM(CASE WHEN e.Target_status = 'Achieved' THEN 1 ELSE 0 END) / 
             SUM(CASE WHEN e.Target_status = 'Not Achieved' THEN 1 END) ratio
FROM Emp e INNER JOIN Site s 
ON e.EmployeeId = s.EmpId
WHERE s.Site = 'SiteA';

并不是说第二个 SUM() 中的 CASE 表达式没有 ELSE 部分,因此如果没有 Target_status = 'Not Achieved' 的员工,结果将是 NULL 而不是 0 会引发“除以零错误”。

参见demo

你可以通过简单的方式获得它

select CAST(SUM(CASE WHEN a.Target_status='Achieved' THEN 1 ELSE 0 END) AS VARCHAR) +'/'+CAST(SUM(CASE WHEN a.Target_status='Not Achieved' THEN 1 ELSE 0 END) AS VARCHAR) Ratio
from Emp a
inner join Site b on a.EmployeeId = b.EmpId
where Site = 'SiteA'

这将return

3/2