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

MS SQL 2019行多列求和存入新列时数值拼接不叠加问题求助

问题根因排查
  • 你当前写法的核心错误是类型转换的执行顺序不对:a01b + a02a执行时因为两个列是字符类型,SQL Server会优先执行字符串拼接,拼接完成后才会转成int做sum,自然就出现了你说的「数值堆叠」效果。
  • 修正逻辑:先单独把每一列转成数值类型,再做加法运算。
修复后的基础写法
SELECT 
  PartNumber, 
  SUM(CAST(a01b AS INT) + CAST(a02a AS INT)) AS total
FROM bincount
GROUP BY PartNumber
针对后续要累加100+列的优化方案

如果手动写100多次CAST太繁琐,可以用动态SQL批量生成查询语句,避免手动拼写错误:

DECLARE @sql NVARCHAR(MAX), @cols NVARCHAR(MAX)
-- 这里指定你需要累加的列名匹配规则,可根据实际列名格式调整
SELECT @cols = STRING_AGG('CAST(' + COLUMN_NAME + ' AS INT)', ' + ')
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'bincount' 
AND COLUMN_NAME LIKE 'a[0-9][0-9][a-z]' -- 匹配a01b、a02a这类命名格式的列
AND COLUMN_NAME NOT IN ('PartNumber') -- 排除不需要累加的列

SET @sql = N'
SELECT PartNumber, SUM(' + @cols + ') AS total
FROM bincount
GROUP BY PartNumber
'
-- 执行动态SQL
EXEC sp_executesql @sql
注意事项
  • 转换前请确认所有要累加的列里没有非数字字符,如果存在空值、字母等无效内容,可以用TRY_CAST代替CAST,无效值会自动转成NULL,配合ISNULL可转成0参与计算,避免报错:
    示例:SUM(ISNULL(TRY_CAST(a01b AS INT),0) + ISNULL(TRY_CAST(a02a AS INT),0))
  • 如果需要把计算结果持久化存入新列,可以在查询里加INTO 新表名,或者给原表添加持久化计算列。

内容的提问来源于stack exchange,提问作者Jvang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:57:07