Добавление столбцов подсчета на основе критериев в подзапросе - PullRequest
0 голосов
/ 23 ноября 2018

Надеюсь, я могу сформулировать это правильно.У меня есть 3 таблицы в базе данных Risk & Control.

Таблица 1 содержит подробную информацию обо всех рисках и их вероятности возникновения.Идентификатор риска является уникальным значением:

Risk ID |Risk Desc |Impact  | Likelihood
4363    | XXX      | High   | Likely
2357    | XXX      | Low    | Unlikely
7629    | XXX      | Medium | Unlikely
1929    | XXX      | Low    | Likely

Таблица 2 содержит подробную информацию обо всех элементах управления и оценку их эффективности.Идентификатор элемента управления является уникальным значением:

Control ID | Control Rating 
4566       | Effective
1431       | Not Effective
6724       | Effective
3415       | Effective

Таблица 3 содержит сопоставление рисков с их связанными элементами управления в виде отношения «многие ко многим», т. Е. Риск может быть связан с несколькими элементами управления и наоборот.

Risk ID  | Control |
4363     | 4566    |
4363     | 1431    |
2357     | 4566    |
7629     | 6724    |

Я пытаюсь создать представление обо всех рисках и агрегированное представление об их эффективности контроля с помощью трех столбцов подсчета.Один, который подсчитывает общее количество связанных элементов управления, один, который подсчитывает общее количество ЭФФЕКТИВНЫХ элементов управления, и тот, который подсчитывает общее количество НЕЭФФЕКТИВНЫХ элементов управления.

Вывод будет выглядеть следующим образом:

Risk ID |Risk Desc |Impact  | Likelihood | Controls | Effective | Not Effective 
4363    | XXX      | High   | Likely     | 2        | 1         | 1
2357    | XXX      | Low    | Unlikely   | 1        | 1         | 0
7629    | XXX      | Medium | Unlikely   | 1        | 1         | 0
1929    | XXX      | Low    | Likely     | 1        | 0         | 1

Мне удалось получить первую часть, но я не уверен, как мне добавить другие подсчеты?

SELECT Table_1.RISK_ID,
       Table_1.RISK_DESC,
       Table_1.Impact,       
       Table_1.Likelihood,
COUNT(TABLE_2.CONTROL_ID) AS Total_Controls
FROM Table_1
INNER JOIN Table_2
ON Table_1.RISK_ID       = Table_2.RISK_ID
GROUP BY Table_1.RISK_ID,
         Table_1.RISK_DESC,
         Table_1.Impact,       
         Table_1.Likelihood

Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Я не совсем уверен, правильно ли это.В ваших примерах таблиц у вас нет идентификатора риска в таблице два, но в вашем примере показано, как вы объединяете таблицу один и таблицу два по risk_id?Поэтому я просто напишу это, предполагая, что ваши примеры таблиц верны.

    SELECT Table_1.RISK_ID,
       Table_1.RISK_DESC,
       Table_1.Impact,       
       Table_1.Likelihood,
COUNT(TABLE_2.CONTROL_ID) AS Total_Controls,
COUNT(CASE WHEN CONTROL_RATING IN ('Effective') THEN 'x' END) as effective,
COUNT(CASE WHEN CONTROL_RATING IN ('Not Effective') THEN 'x' END) as not_effective
FROM Table_1
INNER JOIN Table_3 
ON Table_3.Risk_ID = Table_1.Risk_ID
INNER JOIN Table_2
ON Table_2.CONTROL_ID       = Table_3.CONTROL
GROUP BY Table_1.RISK_ID,
         Table_1.RISK_DESC,
         Table_1.Impact,       
         Table_1.Likelihood

Сумма также будет работать в этом, но вы хотели COUNT ()

0 голосов
/ 23 ноября 2018

Вы можете использовать простую математику и агрегацию для своих «эффективных» и «неэффективных» столбцов.Псевдокод:

Controls = COUNT (*)

Effective = SUM (CASE WHEN Control_Rating = "Effective" THEN 1 ELSE 0 END)

Not Effective = SUM (CASEWHEN Control_Rating = "Неэффективно" THEN 1 ELSE 0 END)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...