首页 > 数据库 >MySql中SUM函数计算错误问题

MySql中SUM函数计算错误问题

时间:2024-03-09 15:56:43浏览次数:28  
标签:计算错误 数字 SUM 列表 问题 导入 计算 MySql 数据

前言

今天一个很久前做的项目突然找到我,说是之前做的项目中,页面上数据汇总和列表中的数据的总数存在对不上的问题。说是列表是对的,但是根据列表统计出来的数据要比正常小很多。

排查

这个项目已经好几年了,之前用了很久都是正常的,不可能会突然出问题了;我觉得这个统计肯定是没问题了,很大可能就是统计是对的,但是导入的数据不对。

第一步,我浏览一遍这个功能的源码,找到统计和列表的执行的SQL语句,查询在数据中查询,手动使用sum函数再计算一下,发现和页面上统计出来的是一致的,这个时候我强烈怀疑是不是他算错了就是这个,这个时候我也注意到,列表查询的数据行数和导入数据的行数不一致,询问后那边回复,有少数数据为0,导入后手动删除了。至此,没有找到具体的问题。

第二步,将列表中的数据导出为Excel文件,使用Excel求和,结果发现这个数据是对的;我都开始怀疑是不是Excel的求和计算有什么问题;发现两边计算不多时,我就将这一列的数据复制到vscode中,写了一个python将一列放到List中,使用sum(list) 计算,因为数据行有几百上千,我不可能一个个删除换行符,手动插入逗号,所以我是将换行符直接替换为逗号,结果发现计算出来的值,既和Excel计算的不一致,也和mysql sum函数计算的不一致,我就在打印了一行list的数据,发现比数据行多了几个;我当时还怀疑是不是复制的时候不小心多,我就有重新复制了一份,就上下滚动看一了一行,发现里面超过千的数据都有一个分隔符,突然我就想到会不会分隔符的问题,手动删除了,在重新计算了一遍,发现数据是对的,至此,问题已经找到,就是导入数据时,数字中包含分隔符,所以计算有问题。树洞修改数据库中带分隔符的数据,数据正常。

结论

排查问题时,还是犯了惯性思维的错误,总觉得这么久的功能不可能是有问题的。最后发现确实bug导致。
导致这个问题出现的原因是,数据库设计时,数字字段使用了varchat字段,导入数据时没有判断是否为数字。其次是mysql数据在字符串做计算时,会自动将字符串转化为数字,但是如果文本不为数字时,会从前往后提取数字,一旦碰到非数字的就直接忽略后续所有的字符。

以下为转化数字文本的具体事例:
image

标签:计算错误,数字,SUM,列表,问题,导入,计算,MySql,数据
From: https://www.cnblogs.com/yanghucai/p/18062823

相关文章

  • Binary Tree Maximum Path Sum
    SourceGivenabinarytree,findthemaximumpathsum.Thepathmaystartandendatanynodeinthetree.ExampleGiventhebelowbinarytree,1/\23Return6.题解1-递归中仅返回子树路径长度题目很短,要求返回最大路径和。咋看一下......
  • MYSQL学习笔记22: 多表查询
    多表查询单表查询查询emp表select*fromemp;查询dept表select*fromdept;笛卡尔积(全组合)#emp表有4条记录,dept表有6条记录#笛卡尔积有4*6=24条记录select*fromemp,dept;消除无效的笛卡尔积(emp和dept通过dept_id连接)select*fromemp,deptw......
  • MySQL 入门指南
    目录1.简介和基础概念1.1.MySQL是什么?1.2.数据库管理系统(DBMS)的基本概念1.3.SQL(StructuredQueryLanguage)的作用和重要性2.安装和配置MySQL2.1.在Linux下使用Docker进行MySQL的安装和配置2.2.Windows、MacOS下的安装步骤(待补充)3.SQL基础3.1.SQL的基本语法......
  • MYSQl学习笔记19: 外键约束
    外键约束用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性具有外键的表(emp)称为子表外键关联的表(dept)称为父表外键约束创建表时添加createtable表名(字段名数据类型,[constrain][外键名称]foreignkey(外键字段名)references主表(主表......
  • MYSQL学习笔记20: 外键约束(删除/更新行为)
    外键约束删除/更新行为setdefault在mysql的默认引擎innodb中不支持CASCADEaltertable表名addconstraint外键名称foreignkey(外键字段)references主表名(主表字段名)onupdatecascadeondeletecascade;建立外键约束#如果父表和子表建立外键的字段有不同的......
  • MYSQL学习笔记17: 流程控制函数(IF, CASE)
    流程控制函数(IF,CASE)ifselectif(true,'ok','error');selectif(false,'ok','error');/*相当于iftrue:ok;else:error;*/ifnullselectifnull('ok','default');selectifnull(......
  • MYSQL学习笔记18: 约束
    约束约束是作用于表中字段上的规则,用于限制存储在表中的数据.保证表中的正确性,有效性和完整性约束作用于表中字段上,可以在建表和修改表时为表添加约束按照需求创建表,并创建约束createtableusers(idintprimarykeyauto_incrementcomment'主键',n......
  • MYSQL学习笔记15: 数值函数
    数值函数ceil向上取整(并不是四舍五入)selectceil(1.5);selectceil(2.1);floor向下取整selectfloor(3.9);selectfloor(2.0);mod取模(余数)selectmod(7,4);rand0-1的随机小数,不包括0和1selectrand();round四舍五入#参数2:保留的......
  • MYSQL学习笔记16: 日期函数
    日期函数返回当前日期selectcurdate();返回当前时间(24小时制)selectcurtime();返回当前日期+时间selectnow();YEAR,MONTH,DAY获取当前时间对应的年月日selectyear(now());selectmonth(now());selectday(now());在制定日期上增加时间后的日期......
  • MYSQL学习笔记9: DQL排序查询(升降序)
    DQL排序查询select字段列表from表名orderby字段1排序方式1,字段2排序方式2;排序方式ASC升序(默认)DESC降序如果是多字段排序,第一个字段值相同,会根据第二个字段的值进行排序,以此类推按年龄降序排序select*fromworkersorderbyagedesc;......