需要在查询中捕获NULL

时间:2014-07-22 16:42:59

标签: postgresql

我有一个查询显示员工的成功率并且工作出色,除了:如果员工" 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没有显示(日期范围内没有放电)

1 个答案:

答案 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;