使用JOIN进行SQL查询计数

时间:2020-04-27 08:23:29

标签: mysql sql

我有以下运行良好的SQL查询,但现在我想根据以下情况计算计数:

      SELECT d.vseverity, v.vulnstatus, v.vtitleid, d.vtitle 
    FROM vulnsummary v 
    JOIN project p ON v.projid = p.projid 
               AND v.stagename = p.currentstage 
    JOIN datasets d ON v.vtitleid = d.datasetid

当前输出为:

Text

现在我想以这种方式显示计数:

高(开盘)-2

高(关闭)-0

中等(开放)-1

中等(已关闭)-0

低(打开)-3

低(关闭)-1

请帮助我解决此查询,谢谢

2 个答案:

答案 0 :(得分:2)

您需要先CROSS JOIN组不同的严重性和状态值,然后LEFT JOIN到表中,以允许您计算每种严重性/状态组合的值。如果没有样本数据,很难确定,但是这样的方法应该可以工作:

SELECT sv.vseverity, st.vulnstatus, COUNT(v.vseverity) AS count
FROM (
    SELECT DISTINCT vseverity
    FROM datasets
) sv
CROSS JOIN (
    SELECT DISTINCT vulnstatus
    FROM vulnsummary
) st
LEFT JOIN (
    SELECT d.vseverity, v.vulnstatus 
    FROM vulnsummary v 
    JOIN project p ON v.projid = p.projid 
                  AND v.stagename = p.currentstage 
    JOIN datasets d ON v.vtitleid = d.datasetid
) v ON v.vseverity = sv.vseverity AND v.vulnstatus = st.vulnstatus
GROUP BY sv.vseverity, st.vulnstatus

答案 1 :(得分:0)

我没有完整的数据集,但是,对主volnstatus表的RIGHT OUTER JOIN将启用(volnstatus表显示所有选项,即“打开”,“关闭”)。一个粗略的草稿示例,仅填充了volnstatus表:

SELECT COUNT(s.vulnstatus) CountOf, t.vtype
FROM dbo.vusummary s
    RIGHT OUTER JOIN
        vusummarytype t
            ON s.vulnstatus = t.vtype
GROUP BY t.vtype