2017-01-12 2 views
0

У меня есть следующий (пример) таблица:SQL - выберите значение, которое соответствует только некоторым (несколько) уникальным условиям

+-------------+------------+----------+---------+ 
| alarminc_no | cust_name | event_id | site_no | 
+-------------+------------+----------+---------+ 
|  99999 | Jonh Smith | UYALR | 9090 | 
|  99999 | Jonh Smith | UYBR  | 9090 | 
|  99999 | Jonh Smith | PAF  |   | 
|  77777 | Allan  | UYBIC | 9090 | 
|  77777 | Allan  | UYBR  | 9090 | 
|  77777 | Allan  | PAF  | 9090 | 
|  88888 | Susan  | UYGR  | 9090 | 
|  88888 | Susan  | UYLAR | 9090 | 
|  88888 | Susan  | PAF  | 9090 | 
+-------------+------------+----------+---------+ 

Мне нужна alarminc_no, который соответствует следующему event_id'S:

'СУПА', «PFA», «USABA», «USALR», «USBUR», «USDUR», «USFIR», «USPAN», «USTAM», «UYALR», «UYAVI», «UYBUR», «UYDIR», UYDUR ',' UYE73 ',' UYFIR ',' UYMED ', ' UYPAN ',' UYTAM

Есть МНОГО других event_ids, мне нужно ТОЛЬКО номер alarminc_no s, который содержит эти event_id, а не другие. Каждый Alarminc_no имеет несколько event_IDs, мне нужно каждый, который содержит по крайней мере одно из этих значений, не имеет значения, если содержит другой также, правило:

Каждый AlarmInc_no в ouptut, должны иметь в event_id обязательной ФАТ, PFA и некоторые из событий списка (эти события также являются обязательными, по крайней мере один из них должен присутствовать), а также может иметь и другие события.

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

SELECT * 
FROM MYTABLE 
JOIN (
    SELECT DISTINCT alarminc_no, system_no 
    FROM (
    SELECT alarminc_no,system_no, 
     CASE WHEN event_id in 
     ('PAF','PFA','USABA','USALR','USBUR','USDUR','USFIR','USPAN','USTAM', 
      'UYALR','UYAVI','UYBUR','UYDIR','UYDUR','UYE73','UYFIR','UYMED', 
      'UYPAN','UYTAM') THEN 0 ELSE 1 END AS BAD, 
     CASE WHEN event_id in ('PAF','PFA') THEN 1 ELSE 0 END AS GOOD 
    FROM MYTABLE 
    where event_date between '01/12/2016' and '31/12/2018' 
) X 
    GROUP BY alarminc_no, system_no 
    HAVING SUM(BAD) = 0 AND SUM(GOOD) > 0 AND COUNT(*) > 1 
) X ON MYTABLE.alarmic_no = X.alarmic_no AND MYTABLE.system_no = x.system_no 

Это скриншот выхода:

https://i.stack.imgur.com/Hp3ax.png

Заранее спасибо за вашу помощь!

+0

Какой ожидаемый выход? – wdosanjos

+0

Если ваш первый оператор CASE представляет собой список «хороших» идентификаторов событий, не называйте их «плохими» ... назовите их «ХОРОШО». Переместите весь этот список до утверждения «GOOD». Затем удалите первый оператор CASE. Затем измените оператор HAVING на: 'HAVING SUM (GOOD)> 0' Если это не дает ваш ожидаемый результат, вы не будете правильно объяснять свои ограничения вывода. – abraxascarab

+0

Я благодарю вас за ваше время !. Мне нужно получить alarminc_no, у которых есть PFA и PAF (всегда) и некоторые другие значения списка, покупайте ТОЛЬКО эти (есть много событийных событий, мне нужен каждый alarmINC, который имеет хотя бы одну ссылку на любое из значений список). Этот скрипт работает частично, по какой-то причине он дает мне часть событий, которые я хочу, но оставил другие, я должен уточнить, что каждый alarminc_no содержит несколько идентификаторов событий, и если AlarmInc имеет идентификатор события (например, UYALR), а другой нет Мне нужен он в выходе, так как UYALR присутствует. – Demian

ответ

0

Основываясь на вашем описании, сценарий должен исключать часть «ХОРОШЕЕ». Утверждение HAVING будет верно только для alarminc_no, у которых есть запись с event_id в («PAF», «PFA») и вторая запись, в которой группа event_id входит в большую группу. Если ('СУП', 'PFA') не требуется, вы можете попробовать измененный скрипт ниже:

SELECT * 
 
FROM MYTABLE 
 
JOIN (
 
    SELECT DISTINCT alarminc_no, system_no 
 
    FROM (
 
    SELECT alarminc_no,system_no, 
 
     CASE WHEN event_id in 
 
     ('PAF','PFA','USABA','USALR','USBUR','USDUR','USFIR','USPAN','USTAM', 
 
      'UYALR','UYAVI','UYBUR','UYDIR','UYDUR','UYE73','UYFIR','UYMED', 
 
      'UYPAN','UYTAM') THEN 0 ELSE 1 END AS BAD--, 
 
     --CASE WHEN event_id in ('PAF','PFA') THEN 1 ELSE 0 END AS GOOD 
 
    FROM MYTABLE 
 
    where event_date between '01/12/2016' and '31/12/2018' 
 
) X 
 
    GROUP BY alarminc_no, system_no 
 
    HAVING SUM(BAD) = 0 /*AND SUM(GOOD) > 0*/ AND COUNT(*) > 1 
 
) X ON MYTABLE.alarmic_no = X.alarmic_no AND MYTABLE.system_no = x.system_no

+0

Привет, спасибо за ваше время !. Мне нужно получить alarminc_no, у которых есть PFA и PAF (всегда) и некоторые другие значения списка, купите ТОЛЬКО эти (есть много событийных событий, мне нужен каждый alarmINC, который имеет хотя бы одну ссылку на любое из значений списка). Этот скрипт работает частично, по какой-то причине он дает мне часть событий, которые я хочу, но оставил другие, я должен уточнить, что каждый alarminc_no содержит несколько идентификаторов событий, и если AlarmInc требуется идентификатор события (например, UYALR) и другой не нужен, мне все равно нужен выход, потому что присутствует UYALR. – Demian

+0

Хорошо, вы можете заменить предложение HAVING следующим и проверить его: HAVING (SUM (BAD) = 0 ИЛИ SUM (GOOD)> 0) AND COUNT (*)> 1 – MayowaO

+0

Замена предложения having, как вы говорите, дает мне следующая ошибка: «имя столбца« хорошо »недействительно». Любые советы? Спасибо! – Demian

0

получить записи:

SELECT * 
FROM @your_table t 
WHERE t.event_id IN ('PAF','PFA','USABA','USALR','USBUR','USDUR','USFIR','USPAN','USTAM','UYALR','UYAVI','UYBUR','UYDIR','UYDUR','UYE73','UYFIR','UYMED','UYPAN','UYTAM') 
    AND NOT EXISTS (
     SELECT 1 
     FROM @your_table tt 
     WHERE t.alarmic_no = tt.alarmic_no 
      AND tt.event_id NOT IN ('PAF','PFA','USABA','USALR','USBUR','USDUR','USFIR','USPAN','USTAM','UYALR','UYAVI','UYBUR','UYDIR','UYDUR','UYE73','UYFIR','UYMED','UYPAN','UYTAM') 
     ) 

Чтобы получить только alarminc_nos :

SELECT DISTINCT t.alarminsc_no 
FROM @your_table t 
WHERE t.event_id IN ('PAF','PFA','USABA','USALR','USBUR','USDUR','USFIR','USPAN','USTAM','UYALR','UYAVI','UYBUR','UYDIR','UYDUR','UYE73','UYFIR','UYMED','UYPAN','UYTAM') 
    AND NOT EXISTS (
     SELECT 1 
     FROM @your_table tt 
     WHERE t.alarmic_no = tt.alarmic_no 
      AND tt.event_id NOT IN ('PAF','PFA','USABA','USALR','USBUR','USDUR','USFIR','USPAN','USTAM','UYALR','UYAVI','UYBUR','UYDIR','UYDUR','UYE73','UYFIR','UYMED','UYPAN','UYTAM') 
     ) 
+0

Ваш код, похоже, работает, но по какой-то причине выход дает мне все alarminc_nos, у которых есть PAF и PFA, но НЕ остальная часть событий, он перечислил мне все события с PFA и PAF, за исключением тех, которые мне нужны. Это самое близкое, что я получил, и он отлично дал мне все записи, содержащие PAF, PFA, но не остальные ценности, которые я поставил выше, и давая мне другие, можете ли вы вернуть его? это было бы решением, я думаю! и большое спасибо за ваше время. – Demian

+0

Чтобы уточнить (извините за мой eng), см. Это: https://gist.github.com/anonymous/d7b8409a65886dd13e9e0519cfdbfd80 – Demian

Смежные вопросы