2015-04-20 4 views
0

Хорошо, поэтому мне нужно написать запрос, который, вероятно, я делаю намного сложнее, чем нужно, но я мог бы использовать некоторую помощь.Запрос на основе подсчета, времени и местоположения

Мне нужно выбрать записи клиентов, которые не виделись год или более, видели нас более одного раза, но могут быть только один раз, если это не в определенных местах.

Так что я до сих пор:

WITH CTE AS 
(
SELECT 
    client_id, 
    location_id, 
    employee_id, 
    create_timestamp, 
    ROW_NUMBER() OVER(PARTITION BY person_id ORDER BY create_timestamp DESC) AS ROW 
FROM 
    client_Appointment 
) 

SELECT 
    c.client_id, 
    COUNT(*) 
FROM 
    CTE AS ce 
    INNER JOIN person AS c 
     ON p.person_id= ce.client_id 
    INNER JOIN employee_mstr AS em 
     ON em.employee_id = ce.empoyee_id 
    INNER JOIN location_mstr AS lm 
     ON lm.location_id = ce.location_id 
WHERE 
    ce.create_timestamp <= CONVERT(VARCHAR(10), DATEADD(Year,-1,GETDATE()), 120) 
GROUP BY 
    p.person_id 
HAVING 
    COUNT(*) > 1 

Я не уверен, куда идти отсюда. Кроме того, это не дает мне всю информацию, которая мне нужна, и если я добавлю эту информацию в предложение select, я должен использовать ее в группе, что означает, что я не получаю все необходимые записи.

+2

Пожалуйста, добавьте выборочные данные, а также текущий и ожидаемый результат. – paqogomez

+0

Полезно пометить вопросы базы данных как с помощью соответствующего программного обеспечения (MySQL, Oracle, DB2, ...) и версии, например. 'SQL-сервер-2014'. Различия в синтаксисе и особенностях часто влияют на ответы. – HABO

ответ

0

Таким образом, вы хотите, чтобы клиенты, которых не видели в течение года или более, , затем клиенты, которые либо посещают НЕ в определенных местах, либо более одного посещения. Правильно ли я понял?

Примечание: Просто замените (VALUES (1), (2), (3)) с именем таблицы

WITH CTE_visits 
AS 
(
SELECT 
    c.client_id, 
    COUNT(*) AS total_visits, 
    SUM(
      CASE 
       WHEN ce.location_id IN (SELECT ID FROM (VALUES(1),(2),(3)) AS A(ID)) THEN 0 --so when it is a certain location then do NOT count it 
       ELSE 1 --if it is not at the certain locations, then count it 
      END 
     ) AS visits_not_at_certain_locations 
FROM 
    client_Appointment AS ce 
    INNER JOIN person AS c 
     ON p.person_id= ce.client_id 
    INNER JOIN employee_mstr AS em 
     ON em.employee_id = ce.empoyee_id 
    INNER JOIN location_mstr AS lm 
     ON lm.location_id = ce.location_id 
    CROSS APPLY(SELECT client_id, MAX(create_timestamp) last_visit FROM client_Appointment WHERE client_id = ce.client_id GROUP BY client_id) CA --find most recent visit for each client_id 
WHERE 
    ce.create_timestamp <= CONVERT(VARCHAR(10), DATEADD(Year,-1,GETDATE()), 120) --remember this only counts visits over a year ago 
    AND last_visit <= CONVERT(VARCHAR(10), DATEADD(Year,-1,GETDATE()), 120) --says only return client_id's who's last visit is more than a year ago 
GROUP BY 
    p.person_id 
) 

SELECT * 
FROM CTE_visits 
WHERE visits_not_at_certain_locations = 1 --seen once NOT at certain locations 
     OR total_visits > 1 --seen more than once at any location 
Смежные вопросы