ВЫБЕРИТЕ только строку, где все остальные действия завершены - PullRequest
0 голосов
/ 29 мая 2019

У меня есть таблица с именем столбца: ID, Activity, Activity_type, Activity Status.

Здесь статус активности 11 = Завершено, 12 = Не завершено.

Каждый идентификатор связан с видом деятельности call1, call2, email1, email2 и text1. Я хочу запросить все идентификаторы с активностью Text1 с «Activity Status» = 12, когда все остальные «Activity Status» связаны с этим ID = 11.

В этом примере я хотел бы получить вывод Text1 с идентификатором 10, поскольку в идентификаторе 11 все еще есть электронная почта 2 со статусом активности 12. Любая помощь по этому вопросу высоко ценится.

enter image description here

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

Использование GROUP BY и HAVING должно быть рабочим решением, но ваш вопрос, вероятно, имеет два возможных ответа:

  • случай, когда "Activity Status" = 12 и все другие (все остальные) "Activity Status" = 11
  • случай, когда "Activity Status" = 12 и все другие (всего четыре возможных) "Activity Status" = 11

Введите:

CREATE TABLE #Data 
(
    ID int,
    Activity varchar(10),
    Activity_type int,
    Activity_status int
)
INSERT INTO #Data
    (ID, Activity, Activity_type, Activity_status)
VALUES
    (10, 'call1',  10893, 11),
    (10, 'call2',  10894, 11),
    (10, 'email1', 10895, 11),
    (10, 'email2', 10896, 11),
    (10, 'text1',  10897, 12),
    (11, 'call1',  10893, 11),
    (11, 'call2',  10894, 11),
    (11, 'email1', 10895, 11),
    (11, 'email2', 10896, 12),
    (11, 'text1',  10897, 12)

T-SQL (для всех остальных):

SELECT ID
FROM #Data
GROUP BY ID
HAVING
    SUM(CASE WHEN Activity = 'text1' AND Activity_status = 12 THEN 1 END) = 1 AND
    SUM(1) - SUM(CASE WHEN Activity <> 'text1' AND Activity_status = 11 THEN 1 END) = 1

T-SQL (для всех возможных четырех):

SELECT ID
FROM #Data
GROUP BY ID
HAVING
    SUM(CASE WHEN Activity = 'text1' AND Activity_status = 12 THEN 1 END) = 1 AND
    SUM(CASE WHEN Activity IN ('call1', 'call2', 'email1', 'email2') AND Activity_status = 11 THEN 1 END) = 4

Выход:

---
ID
---
10
0 голосов
/ 29 мая 2019

Вы можете использовать group by и having:

select id
from t
group by id
having sum(case when activity = 'Text1' and activity_status = 12 then 1 else 0 end) > 0 and
       sum(case when activity <> 'Text1' and activity_status <> 11 then 1 else 0 end) = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...