SQL实现仅对列中整数求和,保留带小数原数值的方法
解决方案
首先,你的原始列数据是带逗号后缀的字符串类型,需要先清理掉末尾的逗号,再准确判断哪些是整数,最后实现“小数保留原值、整数参与求和”的需求。
问题分析
你之前的SQL错误在于:
- 用
col not like '%,%'判断整数,但大部分整数行(比如1,、2,)本身包含逗号,导致这些行被排除在求和外,只匹配到无逗号的5。 - 使用
SUM()聚合函数会将所有行合并为一行,无法保留小数行的原始输出。
具体实现
根据你的需求,分两种常见场景给出SQL:
场景1:输出原始值+整数总和两列
这种方式会保留所有行的原始数据,同时额外显示所有整数的总和:
SELECT -- 清理末尾逗号,得到原始数值字符串 TRIM(TRAILING ',' FROM col) AS original_value, -- 子查询计算所有整数的总和 (SELECT SUM(CAST(TRIM(TRAILING ',' FROM col) AS DECIMAL(10,2))) FROM your_table -- 严谨判断是否为整数:转换为数值后等于其整数部分(兼容如'1.00,'这类带小数点但值为整数的情况) WHERE CAST(TRIM(TRAILING ',' FROM col) AS DECIMAL(10,2)) = FLOOR(CAST(TRIM(TRAILING ',' FROM col) AS DECIMAL(10,2)))) AS integer_total FROM your_table;
执行后结果:
| original_value | integer_total |
|---|---|
| 1 | 8 |
| 2 | 8 |
| 1.02 | 8 |
| 2.23 | 8 |
| 5 | 8 |
场景2:输出一列,小数保留原值,整数行显示总和
这种方式会将所有整数行替换为总和,小数行保留原始值:
SELECT CASE WHEN CAST(TRIM(TRAILING ',' FROM col) AS DECIMAL(10,2)) = FLOOR(CAST(TRIM(TRAILING ',' FROM col) AS DECIMAL(10,2))) THEN CAST((SELECT SUM(CAST(TRIM(TRAILING ',' FROM col) AS DECIMAL(10,2))) FROM your_table WHERE CAST(TRIM(TRAILING ',' FROM col) AS DECIMAL(10,2)) = FLOOR(CAST(TRIM(TRAILING ',' FROM col) AS DECIMAL(10,2)))) AS VARCHAR(20)) ELSE TRIM(TRAILING ',' FROM col) END AS result FROM your_table;
执行后结果:
| result |
|---|
| 8 |
| 8 |
| 1.02 |
| 2.23 |
| 8 |
注意事项
- 替换
your_table为你的实际表名,col为目标列名。 DECIMAL(10,2)可根据你的数据精度调整,比如如果有更多小数位,可改为DECIMAL(10,4)。
内容的提问来源于stack exchange,提问作者pavan
相关产品推荐
相关产品推荐

