计算土豆泥占比SQL查询报错:子查询返回多值问题求助
问题分析与解决建议
错误原因
你的百分比计算子查询存在核心问题:
(SELECT SUM([Weight]) FROM SpudIndex GROUP BY [Type])会返回所有土豆泥类型的总重量集合(多行结果)(SELECT SUM([Weight]) FROM SpudIndex GROUP BY [Location])会返回所有存储位置的总重量集合(多行结果)
当直接用这两个多行结果做除法时,SQL无法确定行与行的对应关系,因此抛出“子查询返回多个值”的错误。
根据需求“各位置每种土豆泥的占比”,这里的占比逻辑应为当前位置下,该类型土豆泥重量占该位置总重量的百分比,用窗口函数即可高效实现,无需嵌套子查询。
修正后的SQL
SELECT [Location], [Type] AS [Varietal], COUNT([MugId]) AS [Mug Count], SUM([Weight]) AS [Pounds], -- 计算当前类型在对应位置的重量占比,保留两位小数 ROUND( SUM([Weight]) * 100.0 / SUM(SUM([Weight])) OVER (PARTITION BY [Location]), 2 ) AS [Percent] FROM SpudIndex GROUP BY [Location], [Type]
逻辑说明
SUM([Weight]):当前位置下当前类型土豆泥的总重量SUM(SUM([Weight])) OVER (PARTITION BY [Location]):通过窗口函数按位置分组,计算每个位置的土豆泥总重量- 两者相除后乘以100.0(用浮点数避免整数除法误差),再用
ROUND函数控制小数位数,最终得到占比百分比
若你的需求是当前类型土豆泥重量占全局所有土豆泥总重量的百分比,只需将窗口函数改为SUM(SUM([Weight])) OVER ()(去掉PARTITION BY,统计全局总和)即可。
内容的提问来源于stack exchange,提问作者ChasetopherB
相关产品推荐
相关产品推荐

