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
相关产品推荐
相关产品推荐

