【问题标题】:Adding count columns based on criteria within sub query根据子查询中的条件添加计数列
【发布时间】:2018-11-23 16:18:08
【问题描述】:

希望我能正确地表达这一点。我在风险与控制数据库中有 3 个表。

表 1 包含有关所有风险及其发生可能性的详细信息。风险 ID 是唯一值:

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

表 2 包含所有控制的详细信息,以及对其有效性的评级。控件 ID 是唯一值:

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    |

我正在尝试创建一个包含 3 个计数列的所有风险视图及其控制有效性的聚合视图。一种计算链接控件的总数,一种计算有效控件的总数,另一种计算无效控件的总数。

输出如下所示:

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

非常感谢任何帮助。

【问题讨论】:

    标签: sql oracle count


    【解决方案1】:

    我不确定这是否正确。在您的示例表中,您在表二中没有风险 ID,但您的示例显示您在 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
    

    Sum 也适用于此,但您需要 COUNT()

    【讨论】:

    • 感谢 K.Layton - 我在提供示例表时犯了错误。您的解决方案效果很好!
    【解决方案2】:

    您可以对“有效”和“无效”列使用简单的数学和聚合。伪代码:

    控件 = COUNT(*)

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 1970-01-01
      • 2020-12-26
      • 2023-03-09
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      相关资源
      最近更新 更多