Возврат значений SQL для всех полей с другим значением - если присутствует еще одно значение - PullRequest
0 голосов
/ 21 января 2019

Я борюсь с Оракулом (снова), и, как относительный новичок, надеялся, что кто-то может посоветовать.

У нас есть база данных Assyst с несколькими таблицами. То, что я пытаюсь сделать, это сообщить обо всех записях в act_reg, где присутствует инцидент.incident_id - но ТОЛЬКО если есть хотя бы одно вхождение определенного serv_dept_id в этом акте_reg.

Ясно, как грязь, я знаю.

Я пробовал предложение WHERE EXISTS, однако кажется, что он возвращает строку только в том случае, если строка содержит именно тот serv_dept_id, который я ищу, а не там, где совпадает толькоident_id. Не все записи с инцидентами, если они присутствуют один или несколько раз.

В приведенном ниже примере есть небольшой объем псевдокода (две выбранные строки Action и Team), поскольку они связаны с другими таблицами и выходят за рамки запроса.

select incident.incident_ref "Call Ref",
act_reg.date_actioned "Date Actioned",
    act_reg.action "Action",
    act_reg.team "Team"
from incident, act_reg

where incident.incident_id = act_reg.incident_id
and exists (
     SELECT jptsys_svd_group.svd_group_id
     FROM serv_dept act_svd_2, jptsys_svd_group
     WHERE act_svd_2.serv_dept_id = act_reg.serv_dept_id
     AND act_svd_2.svd_group_id = jptsys_svd_group.svd_group_id
     AND jptsys_svd_group.svd_group_sc = 'TEAM 1 GROUP'
    )

То, что я ожидаю (скажем, команда 1 входит в группу 1 команды выше, но нет другой команды):

 Call Ref | Date Actioned | Action     | Team
 --------------------------------------------
 27       | 01/01/2019    | Assign     | Team 1
 27       | 01/01/2019    | Update     | Team 2
 27       | 02/01/2019    | Info       | Team 2
 27       | 02/01/2019    | Close      | Team 1

Что я получаю:

 Call Ref | Date Actioned | Action     | Team
 --------------------------------------------
 27       | 01/01/2019    | Assign     | Team 1
 27       | 02/01/2019    | Close      | Team 1

Любая помощь очень ценится. Я не уверен, куда идти отсюда.

Пример данных ниже:

 Call Ref | Date Actioned | Action     | Team
 --------------------------------------------
 27       | 01/01/2019    | Assign     | Team 1
 28       | 01/01/2019    | Create     | Team 3
 29       | 01/01/2019    | Create     | Team 4
 27       | 01/01/2019    | Update     | Team 2
 27       | 02/01/2019    | Info       | Team 2
 31       | 02/01/2019    | Update     | Team 2
 27       | 02/01/2019    | Close      | Team 1

Я хотел бы видеть все строки для ссылки на вызов, если (в этом случае) команда 1 выполнила какое-либо действие над ним. Таким образом, в приведенных выше примерах данных будут возвращены все строки с вызовом ref 27, потому что команда 1 присутствует в некоторых строках с этой ссылкой.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы можете использовать аналитические функции для достижения своей цели - здесь я использую MAX() OVER (), но вы можете сделать это с COUNT() OVER (), если хотите:

WITH your_table AS (SELECT 27 call_ref, to_date('01/01/2019', 'dd/mm/yyyy') date_actioned, 'Assign' action, 'Team 1' team FROM dual UNION ALL
                    SELECT 28 call_ref, to_date('01/01/2019', 'dd/mm/yyyy') date_actioned, 'Create' action, 'Team 3' team FROM dual UNION ALL
                    SELECT 29 call_ref, to_date('01/01/2019', 'dd/mm/yyyy') date_actioned, 'Create' action, 'Team 4' team FROM dual UNION ALL
                    SELECT 27 call_ref, to_date('01/01/2019', 'dd/mm/yyyy') date_actioned, 'Update' action, 'Team 2' team FROM dual UNION ALL
                    SELECT 27 call_ref, to_date('02/01/2019', 'dd/mm/yyyy') date_actioned, 'Info' action, 'Team 2' team FROM dual UNION ALL
                    SELECT 31 call_ref, to_date('02/01/2019', 'dd/mm/yyyy') date_actioned, 'Update' action, 'Team 2' team FROM dual UNION ALL
                    SELECT 27 call_ref, to_date('02/01/2019', 'dd/mm/yyyy') date_actioned, 'Close' action, 'Team 1' team FROM dual)
SELECT call_ref,
       date_actioned,
       action,
       team
FROM   (SELECT call_ref,
               date_actioned,
               action,
               team,
               MAX(CASE WHEN team = 'Team 1' THEN team END) OVER (PARTITION BY call_ref) team_interested_in
        FROM   your_table)
WHERE  team_interested_in = 'Team 1';

  CALL_REF DATE_ACTIONED ACTION TEAM
---------- ------------- ------ ------
        27 01/01/2019    Assign Team 1
        27 01/01/2019    Update Team 2
        27 02/01/2019    Info   Team 2
        27 02/01/2019    Close  Team 1

Это работает путем преобразования команды в Team 1 (интересующее нас значение) или в NULL. Затем мы находим значение MAX и применяем его ко всем строкам в группе (которая основана на call_ref).

Если команда 1 появляется в любой из строк, наш новый столбец будет содержать команду 1 для всех строк, что означает, что мы можем фильтровать по этому столбцу.

0 голосов
/ 21 января 2019

Если я правильно понимаю ваш вопрос, ваше предложение WHERE EXISTS соотносится с act_reg.serv_dept_id строки в главном разделе и звучит так, как будто вы не этого хотите.Предполагая, что incident_id нет в этих двух других таблицах (это поможет увидеть структуру всех таблиц в запросе), вам придется снова ввести act_reg.Попробуйте это для предложения EXISTS:

and exists (
     SELECT jptsys_svd_group.svd_group_id
     FROM serv_dept act_svd_2, jptsys_svd_group, act_reg AS ACT_REG2
     WHERE ACT_REG2.incident_id = act_reg.incident_id
     AND act_svd_2.serv_dept_id = ACT_REG2.serv_dept_id
     AND act_svd_2.svd_group_id = jptsys_svd_group.svd_group_id
     AND jptsys_svd_group.svd_group_sc = 'TEAM 1 GROUP'
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...