繁体   English   中英

将相关查询除以不相关查询

[英]Dividing correlated query by uncorrelated query

我正在尝试编写SELECT语句,该语句将基于两个查询的结果来计算百分比。

我需要对生成VulnerabilityCount和VulnerabilityCountAll的两个子查询的结果进行划分。 我还将结果四舍五入到小数点后两位。

这是代码:

 SELECT tblControl.ControlName,
     (SELECT COUNT(CONVERT(REAL,tblVulnerability.VulnerabilityID))
     FROM tblVulnerability
     WHERE tbl.Vulnerability.ControlID = tblControl.ControlID ) AS VulnerabilityCount,

     (SELECT COUNT(CONVERT(REAL,tblVulnerability.VulnerabilityID))
     FROM tblVulnerability) AS VulnerabilityCountAll, 

     /* This is where I am dividing the two subqueries */
     (SELECT(ROUND(CONVERT(REAL,(
          (SELECT COUNT(CONVERT(REAL,tblVulnerability.VulnerabilityID))
      FROM tblVulnerability
      WHERE tbl.Vulnerability.ControlID = tblControl.ControlID )
      /
     (SELECT COUNT(CONVERT(REAL,tblVulnerability.VulnerabilityID))
     FROM tblVulnerability)
     )),2))) AS Percentage

 FROM tblControl
 WHERE tblControl.Effectiveness = '10'
 ORDER BY VulnerabilityCount DESC, tblControl.ControlName ASC

该查询将运行,但会为“百分比”列生成值“ 0”,而不是真实百分比。

计数函数的输出是整数。 您将整数除以整数,因此操作的输出类型为整数。 您应该将计数值而不是参数转换为实数,如下所示:

 SELECT tblControl.ControlName,

     (SELECT CONVERT(REAL,COUNT(tblVulnerability.VulnerabilityID))
     FROM tblVulnerability
     WHERE tbl.Vulnerability.ControlID = tblControl.ControlID ) AS VulnerabilityCount,

     (SELECT CONVERT(REAL,COUNT(tblVulnerability.VulnerabilityID))
     FROM tblVulnerability) AS VulnerabilityCountAll, 

     /* This is where I am dividing the two subqueries */
     (SELECT(ROUND(CONVERT(REAL,(
          (SELECT CONVERT(REAL,COUNT(tblVulnerability.VulnerabilityID))
      FROM tblVulnerability
      WHERE tbl.Vulnerability.ControlID = tblControl.ControlID )
      /
     (SELECT CONVERT(REAL,COUNT(tblVulnerability.VulnerabilityID))
     FROM tblVulnerability)
     )),2))) AS Percentage
 FROM tblControl
 WHERE tblControl.Effectiveness = '10'
 ORDER BY VulnerabilityCount DESC, tblControl.ControlName ASC

尽管可能更有效,更清晰的查询将通过以下方式使用与组的联接:

 select tblControl.ControlName,
    COUNT(tblVulnerability.VulnerabilityID) VulnerabilityCount,
    (select COUNT(VulnerabilityID) from tblVulnerability) as VulnerabilityCountAll,
    CONVERT(REAL,COUNT(tblVulnerability.VulnerabilityID))
        / (select COUNT(VulnerabilityID) from tblVulnerability) AS Percentage
 from tblControl
 join tblVulnerability
 on tblControl.ControlID = tblVulnerability.ControlID
 where tblControl.Effectiveness = '10'
 Group by tblControl.ControlName 
 ORDER BY VulnerabilityCount DESC, tblControl.ControlName ASC

我在您的问题中发现很多遗漏的部分。 样本数据和您的期望将有助于提供准确的答案。 我试图用查询中的逻辑来回答。 如果您要运行上面提供的查询,我相信它会抛出错误,因为您有tbl.Vulnerability .ControlID = tblControl.ControlID,我相信表名是tblVulnerability。

为了计数,您为什么需要将ID转换为Real类型? 我不确定是合乎逻辑还是需要求和,我是否根据您的问题中所述的计数提供答案。 希望这可以帮助。

 with VC
 (
 select tblVulnerability.ControlID , 
 count(*) over (Partition by ControlID) as ControlVulnerabilityCount
 , count(*) as VulnerabilityCount
 from tblVulnerability
 )
 select tblControl.ControlName,VC.CntV  AS VulnerabilityCount,
 (VC.ControlVulnerabilityCount/ VC.VulnerabilityCount) as Percentage
 from tblControl tc
 join VC on VC.ControlID = tc.ControlID
  WHERE tblControl.Effectiveness = '10'
  order by VC.ControlVulnerabilityCount desc, tblControl.ControlName ASC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM