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

存储过程INT转DECIMAL异常:求和时INT变REAL的技术求助

解决SUM(INT)返回REAL类型的问题

嘿,我碰到过类似的情况,给你几个实用的解决思路:

  • 显式强制转换结果类型
    最直接的办法就是用CAST或CONVERT把SUM的结果转成INT类型,还可以搭配COALESCE处理没有匹配行时返回的NULL:

    SELECT CAST(SUM(attendance) AS INT) FROM core_historic_modestatistik WHERE medlemsid = uID;
    -- 若要把NULL转为0,避免后续逻辑出错
    SELECT COALESCE(CAST(SUM(attendance) AS INT), 0) FROM core_historic_modestatistik WHERE medlemsid = uID;
    
  • 确认列的实际数据类型
    虽然你说attendance是INT,但有时候表结构可能有隐性变化(比如之前是REAL类型后来修改?或者是带计算逻辑的列?),建议先核实列的真实类型:

    -- MySQL/MariaDB 写法
    DESCRIBE core_historic_modestatistik;
    -- SQL Server 写法
    SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'core_historic_modestatistik' AND COLUMN_NAME = 'attendance';
    -- PostgreSQL 写法
    SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'core_historic_modestatistik' AND column_name = 'attendance';
    

    确保列确实是纯INT类型而非带小数的数值类型。

  • 利用变量强制类型约束(存储过程内)
    在存储过程里,把SUM的结果赋值给一个INT类型的变量,数据库会自动做类型约束转换(前提是总和不超出INT的范围):

    -- 以SQL Server为例,其他数据库语法类似
    DECLARE @total_attendance INT;
    SELECT @total_attendance = SUM(attendance) FROM core_historic_modestatistik WHERE medlemsid = uID;
    -- 后续返回@total_attendance即可
    
  • 考虑总和溢出的情况
    如果attendance的总和有可能超过INT的最大值(比如2^31-1,也就是2147483647),那更推荐用BIGINT类型来存储结果——既避免溢出报错,又比REAL类型更精准(REAL是浮点型,会有精度损失)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:21:46