SQL Server视图计算两行Quantity和返回NULL,咨询是否用变量或CAST
解决SQL Server视图中两行数据求和返回NULL的问题
我来帮你拆解下问题根源,再给你两种靠谱的解决方案:
为什么你的语句返回NULL?
当没有找到TransferTo等于当前行RefId的记录时,子查询会返回NULL,而SQL里任何数值和NULL相加结果都是NULL。另外还有个隐藏风险:如果有多行数据的TransferTo匹配当前RefId,你的子查询会直接抛出“子查询返回不止一行”的错误,因为它只能返回单个值。
解决方案1:优化子查询,处理NULL并确保单行返回
用ISNULL(或COALESCE)把子查询的NULL结果替换成0,同时用SUM聚合函数保证子查询始终返回单行(哪怕有多行匹配也能正确求和):
MyAmount = [Quantity] + ISNULL((SELECT SUM([Quantity]) FROM MyTable WHERE [TransferTo] = [RefId]), 0)
解决方案2:用LEFT JOIN提升性能(推荐大数据量场景)
如果你的表数据量较大,子查询每行执行一次的效率会很低,换成提前聚合+LEFT JOIN的方式更高效:
SELECT t1.RefId, t1.Quantity, t1.TransferFrom, t1.TransferTo, t1.Quantity + ISNULL(t2.TotalQuantity, 0) AS MyAmount FROM MyTable t1 LEFT JOIN ( -- 先按TransferTo分组,计算每个目标ID对应的总Quantity SELECT TransferTo, SUM(Quantity) AS TotalQuantity FROM MyTable GROUP BY TransferTo ) t2 ON t2.TransferTo = t1.RefId
额外说明
你不需要用变量或者CAST函数,问题的核心是NULL值处理和子查询的单行返回约束,上面两种方法都能完美解决你的需求。
内容的提问来源于stack exchange,提问作者mosiki
相关产品推荐
相关产品推荐

