SQL查询报错Msg512:子查询返回多值,求修正以计算测试正确率
问题解决:子查询返回多行错误与答题百分比计算实现
错误原因
你的查询存在两个核心问题:
- 两个子查询未与主查询的
ChallengeResults行做关联,导致返回所有ChallengeType='2'的记录集合,而非对应单行的数值,触发了Subquery returned more than 1 value错误。 - 逻辑方向错误:你试图用
ResultPercentage匹配除法结果,而实际需求是计算除法结果填充到ResultPercentage列。
解决方案
根据需求分两种场景实现:
场景1:查询展示正确答题百分比
直接关联三表,每行计算对应百分比(需保留原表其他列可自行补充):
SELECT cr.*, -- 保留ChallengeResults表的所有原有列 -- 计算百分比,100.0触发浮点除法,NULLIF避免除以0报错 CAST(100.0 * cr.CorrectAnswers / NULLIF(cc.NumberOfQuestions, 0) AS DECIMAL(5,2)) AS ResultPercentage FROM ChallengeResults cr INNER JOIN Challenge ch ON cr.ChallengeId = ch.ChallengeId INNER JOIN ChallengeConfiguration cc ON ch.ChallengeConfigurationId = cc.ChallengeConfigurationId WHERE cr.ChallengeType = '2';
场景2:更新表,将百分比存入ResultPercentage列
如果需要把计算结果持久化到ChallengeResults表的ResultPercentage列:
UPDATE cr SET ResultPercentage = CAST(100.0 * cr.CorrectAnswers / NULLIF(cc.NumberOfQuestions, 0) AS DECIMAL(5,2)) FROM ChallengeResults cr INNER JOIN Challenge ch ON cr.ChallengeId = ch.ChallengeId INNER JOIN ChallengeConfiguration cc ON ch.ChallengeConfigurationId = cc.ChallengeConfigurationId WHERE cr.ChallengeType = '2';
关键说明
- 关联逻辑:通过
Challenge表作为中间桥梁,确保每个ChallengeResults记录能匹配到对应的题目总数(来自ChallengeConfiguration)。 - 浮点除法:用
100.0而非100,避免整数除法导致的精度丢失(比如5/2会得到2而非2.5)。 - 防除以0:
NULLIF(cc.NumberOfQuestions, 0)确保当题目总数为0时,结果返回NULL而非报错。 - 精度调整:可根据需求修改
CAST后的类型,比如DECIMAL(3,0)会得到整数百分比,DECIMAL(5,2)保留两位小数。
内容的提问来源于stack exchange,提问作者Leonardo Carvalho
相关产品推荐
相关产品推荐

