You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询报错Msg512:子查询返回多值,求修正以计算测试正确率

问题解决:子查询返回多行错误与答题百分比计算实现

错误原因

你的查询存在两个核心问题:

  1. 两个子查询未与主查询的ChallengeResults行做关联,导致返回所有ChallengeType='2'的记录集合,而非对应单行的数值,触发了Subquery returned more than 1 value错误。
  2. 逻辑方向错误:你试图用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:31:02