[英]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.