我有一个查询显示员工的成功率并且工作出色,除了:如果员工" Bob"在日期范围内没有任何活动,他不会出现在结果中。如果他在查询中至少有一个代码,则会产生0%或100%。如果他的名字上没有附加代码,则他不会在结果中显示。我见过一个例子 - ISNULL(s.code,' No Entry')AS NoContact可以使用,但我想我没有正确使用它 而我无法弄清楚如何将其添加到查询中。有人可以帮忙吗?
这是当前有效的查询(但省略了任何没有任何代码的员工:
SELECT st.staff_id
,round((count(s.code IN ('10401','10402','10403') OR NULL) * 100.0)
/ count(*), 1) AS successes
-- unsuccessful code is 10405
FROM notes n
JOIN services s ON s.zzud_service = n.zrud_service
JOIN staff st ON st.zzud_staff = n.zrud_staff
WHERE n.date_service >= DATE '07/01/2014' AND n.date_service <= CURRENT_DATE
-- n.date_service BETWEEN (now() - '30 days'::interval) AND now()
AND s.code IN ('10401','10402','10403','10405')
GROUP BY st.staff_id;
以下是一个示例结果:
Staff SuccessRate Explination
Sam 100% (has 1 successful and 0 unsuccessful)
Joe 50% (has 1 successful and 1 unsuccessful)
Amy 0% (has 1 unsuccessful)
Bob没有显示(日期范围内没有放电)
答案 0 :(得分:3)
由于您将staff
表放在最后,您需要right join
并将条件移至连接条件。
select
st.staff_id,
round(
count(s.code in ('10401','10402','10403') or null) * 100.0
/
count(*)
, 1) as successes
-- unsuccessful code is 10405
from
notes n
inner join
services s on
s.zzud_service = n.zrud_service and
n.date_service >= date '07/01/2014' and
n.date_service <= current_date
right join
staff st on
st.zzud_staff = n.zrud_staff
-- n.date_service between (now() - '30 days'::interval) and now()
and s.code in ('10401','10402','10403','10405')
group by st.staff_id;