2013-08-24 3 views
0

Ниже приведенный ниже запрос позволяет мне отслеживать, какие услуги были выполнены в диапазоне дат. Я также изменяю его, чтобы показать последние «X» дни.Поиск клиентов без активности в диапазоне дат

Вот моя проблема. Мне нужно найти всех клиентов, у которых не было активности NO в диапазоне дат. Я видел примеры, используя левые внешние соединения (http://www.postgresqlforbeginners.com/2010/11/sql-outer-joins.html), и попытался выполнить его, но результат не показал бы «отсутствующих» сервисов. Мне нужно было увидеть, что «Боб» не видел в прошлые «Х» дни, а не в той деятельности, которая произошла.

Так что, если кто-то может смотреть на это и направить меня к решению, я был бы очень благодарен

Вот запрос:

SELECT groups.name as Office,to_char (notes.date_service,'MM/DD/YY')as DateEntered, 
to_char(notes.date_creation,'MM/DD/YY')as DateService, 
notes.date_creation - notes.date_service as DateDiff, 
services.code, clients.client_id, 
clients.name_lastfirst_cs, staff.staff_name_cs, address.addr_county 
FROM notes, services, clients, staff, groups, address 
WHERE notes.zrud_service = services.zzud_service 
AND notes.zrud_client = clients.zzud_client 
AND notes.zrud_staff = staff.zzud_staff 
AND notes.zrud_group = groups.zzud_group 
AND clients.zzud_client = address.zrud_client 
AND services.code IN ('10101', '10102', '10201' , '10202','10203','10204','10205','10401','10402','10403','10405') - - <I comment out this line and change it depending on the results I need > 

AND groups.name = 'RCE' 
AND notes.date_service BETWEEN (now() - '8 days'::interval)::timestamp AND now(); 
-- this last line is also changed for diferent time spans 

Благодаря

ответ

0

Предполагая, что клиенты хранятся в таблице clients, а их деятельность находится в таблице notes, затем используйте НЕ СУЩЕСТВУЮЩИЕ (антиооин):

-- I need to find all clients ..... 
SELECT * FROM clients 
WHERE 
-- ... that have had NO activity .... 
    NOT EXISTS (
    SELECT 1 FROM notes 
    WHERE notes.zrud_client = clients.zzud_client 
-- ... in a date range. 
     AND notes.date_service BETWEEN (now() - '8 days'::interval)::timestamp AND now() 
) 

выше antijoin могут быть преобразованы в левое внешнее соединение следующим образом:

SELECT clients.* FROM clients 
LEFT JOIN notes 
ON ( 
    notes.zrud_client = clients.zzud_client 
    AND 
    notes.date_service BETWEEN (now() - '8 days'::interval)::timestamp AND now() 
    ) 
WHERE 
    notes.zrud_client IS NULL 
+0

Kordirko - спасибо за руководство меня в правильном направлении. Я попытался с последним высказыванием WHERE прокомментировать, чтобы понять, как это произошло, и, как вы сказали. Затем я добавил несколько заметок клиентам, которые появились в отчете, чтобы узнать, исчезнут ли они в другом запросе, и они это сделают. – Detox

0

Tha основные части ответа являются

  • использование собственно ANSI присоединяется;
  • формат вашего запроса;
  • использование псевдонимов для таблицы;

Таким образом, ваш запрос становится:

select 
    g.name as Office, 
    to_char(n.date_service,'MM/DD/YY') as DateEntered, 
    to_char(n.date_creation,'MM/DD/YY') as DateService, 
    n.date_creation - n.date_service as DateDiff, 
    s.code, c.client_id, 
    c.name_lastfirst_cs, st.staff_name_cs, a.addr_county 
from notes as n 
    inner join services as s on s.zzud_service = n.zrud_service 
    inner join clients as c on c.zzud_client = n.zrud_client 
    inner join staff as st on st.zzud_staff = n.zrud_staff 
    inner join groups as g on g.zzud_group = n.zrud_group 
    inner join address as a on a.zrud_client = c.zzud_client 
where 
    g.name = 'RCE' and 
    s.code in ('10101', '10102', '10201', '10202','10203','10204','10205','10401','10402','10403','10405') and 
    n.date_service BETWEEN (now() - '8 days'::interval)::timestamp AND now(); 

Но если вы хотите, чтобы все клиенты, даже если они не имеют никакой активности в примечаниях в данный период, я думаю, что вы хотите clients быть якорем вас запрос, использовать left outer join и перемещения условий в join вместо where

select 
    c.client_id, 
    c.name_lastfirst_cs, st.staff_name_cs, a.addr_county, 
    g.name as Office, 
    to_char(n.date_service,'MM/DD/YY') as DateEntered, 
    to_char(n.date_creation,'MM/DD/YY') as DateService, 
    n.date_creation - n.date_service as DateDiff, 
    s.code 
from clients as c 
    inner join address as a on a.zrud_client = c.zzud_client 
    left outer join notes as n on n.zrud_client = c.zzud_client and n.date_service BETWEEN (now() - '8 days'::interval)::timestamp AND now() 
    left outer join services as s on s.zzud_service = n.zrud_service and s.code in ('10101', '10102', '10201', '10202','10203','10204','10205','10401','10402','10403','10405') 
    left outer join staff as st on st.zzud_staff = n.zrud_staff 
    left outer join groups as g on g.zzud_group = n.zrud_group and g.name = 'RCE' 
Смежные вопросы