SQL Server 循环访问SQL结果集,将子查询结果添加到结果集

q5lcpyga  于 2022-11-28  发布在  其他
关注(0)|答案(1)|浏览(142)

我有一个包含机器人ID的表[Robots]和一个[TestResults]表,该表具有[RobotId]的[Robots] FK
我的目标是获得[Robots]表中每个robotID的结果集,以及每个ID在[TestResults]中状态为“Active”、“Failed”的所有条目的总数和所有状态的总数,我一直坚持这种方法。
例如:

|RobotId 'R2-D2'|ActiveNum:8|FailedNum:12|TotalNum:20|
|RobotId 'C3P0'|ActiveNum:4|FailedNum:2|TotalNum:9|

我需要一个方法来遍历ID并执行这些查询,如下所示

Select RobotID from Robots Order by RobotID ASC

--iterate through each ID from above result set executing the three queries below

--Get total where test status is active
SELECT count(*) as ActiveNum 
FROM TestResults
WHERE testStatus = 'active' AND RobotID = 'XX'

--Get total where test status is failed
SELECT count(*) as FailedNum 
FROM TestResults
WHERE testStatus = 'failed' AND RobotID = 'XX'

--Get total of all status
SELECT count(*) as TotalNum 
FROM TestResults
WHERE RobotID = 'XX'
krugob8w

krugob8w1#

仅连接并有条件地求和,例如。

select RobotID
    , sum(case when tr.testStatus = 'Active' then 1 end) ActiveNum
    , sum(case when tr.testStatus = 'Failed' then 1 end) FailedNum
    , count(*) TotalNum
from Robots r
left join TestResults tr on tr.RobotID = r.RobotID
group by RobotID asc
order by RobotID asc;

通常情况下,如果你发现自己在考虑SQL中的循环,你就走错了路。它是一种基于集合的语言,所以需要像这样对待。
注意left join,以防机器人没有测试结果,它仍然会显示在列表中。如果这不是所需的行为,请将其更改为inner join

相关问题