необходимо захватить NULL в запросе

Вопрос:

У меня есть запрос, который показывает показатель успеха для персонала и прекрасно работает, за исключением: если у сотрудников “Боба” не было активности в диапазоне дат, он не будет отображаться в результатах. Если бы у него был хотя бы один код в запросе, это привело бы к 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)

Боб не показывает (никаких разрядов в диапазоне дат)

Ответ №1

Так как вы поместите 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;

Оцените статью
TechArks.Ru
Добавить комментарий