SQL转换报错:varchar转int失败,求优化前后每日里程统计方案
问题分析与解决
错误原因
报错是因为'57.006'是带小数点的字符串,直接转int类型会失败——int仅支持整数,无法处理带小数的数值。另外原SQL的GROUP BY包含ma_desc,会按日期+单条记录描述分组,无法得到每日总里程的汇总结果。
修正后的SQL语句
按需求(按日统计优化前后总里程,分别命名为METERS BEFORE和METERS AFTER)调整后的SQL如下:
SELECT s.datreg, -- 统计优化前每日总里程:先转decimal适配小数,再求和 SUM(CONVERT(decimal(10,3), SUBSTRING(s.ma_desc,7,6))) AS [METERS BEFORE], -- 统计优化后每日总里程:通过定位"or."截取对应数值,再求和 SUM(CONVERT(decimal(10,3), SUBSTRING(s.ma_desc, CHARINDEX('or.', s.ma_desc)+3, 7))) AS [METERS AFTER] FROM S16T2 AS s WHERE s.modul='MCAIDist' GROUP BY s.datreg -- 仅按日期分组,实现每日汇总 ORDER BY s.datreg DESC
关键调整点
- 类型转换:先将字符串转为
decimal(10,3)(适配三位小数的数值)再求和,避免转换失败;若不需要小数,可在求和后转int,例如CONVERT(int, SUM(CONVERT(decimal(10,3), ...)))。 - 分组逻辑:移除
GROUP BY中的ma_desc,仅按datreg分组,才能得到每日总里程的汇总结果。 - 灵活截取优化后里程:用
CHARINDEX('or.', s.ma_desc)定位标记位置,再偏移3位截取后续数值,比固定位置39更适配字符串长度变化的情况。
内容的提问来源于stack exchange,提问作者Andrijana K
相关产品推荐
相关产品推荐

