mysql sum函数中对两字段做运算时有null时的情况

简介: mysql sum函数中对两字段做运算时有null时的情况
+关注继续查看

背景

在针对一些数据进行统计汇总的时候,有时会对表中的某些字段进行逻辑运算,如加减乘除,如果要求和的话还可能会用到sum函数,如果两者结合起来应该怎么处理,如果参与运算的字段中出现null值的时候会出现一些什么情况。

问题

CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `name` varchar(20) NOT NULL COMMENT '名称',
  `total_amount` int(11) DEFAULT NULL COMMENT '账户总金额',
  `freeze_amount` int(11) DEFAULT NULL COMMENT '冻结金额',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

数据如下

image

如上表所示,用户信息表中有账户总金额和冻结金额字段,我们现在想要计算可用金额,根据业务场景可用金额 = total_amount - freeze_amount,如果此时要汇总计算表中所有数据的可用金额总和,我们可以写如下SQL。

根据表中的数据,我们知道统计后正确的结果应该是

(2000 - 50) + (1500 - 100) + (500 - 50) + 1000 = 4800

但如果我们这么写,那么得到的结果是错误的。

select sum(total_amount - freeze_amount) from user


 (2000 - 50) + (1500 - 100) + (500 - 50) + (1000 - null) = 3800

 因为1000 - null的结果不是1000而是null,因为null与任何值比较和运算的结果都是null,所以我们应该针对null做特殊处理。

需要主要这样写也是没有用的,因为里面1000-null,仍然是一个错误的结果

select ifnull(sum(total_amount - freeze_amount),0) from user 

 正确的写法应该是

select ifnull(sum(total_amount),0) - ifnull(sum(freeze_amount),0) from user


 

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8天前
|
SQL Oracle 关系型数据库
java实现oracle和mysql的group by分组功能|同时具备max()/min()/sum()/case when 函数等功能
java实现oracle和mysql的group by分组功能|同时具备max()/min()/sum()/case when 函数等功能
|
11天前
|
SQL 关系型数据库 MySQL
MySQL中concat()、concat_ws()、group_concat()三个函数的使用技巧案例与心得总结
MySQL中concat()、concat_ws()、group_concat()三个函数的使用
11 0
MySQL中concat()、concat_ws()、group_concat()三个函数的使用技巧案例与心得总结
|
11天前
|
关系型数据库 MySQL 开发者
MySQL中的substring_index()函数使用方法与技巧!
MySQL中的substring_index()函数的使用
15 0
MySQL中的substring_index()函数使用方法与技巧!
|
16天前
|
SQL 关系型数据库 MySQL
使用MySQL数据库中的函数
使用MySQL数据库中的函数。
25 2
|
23天前
|
存储 JSON 关系型数据库
深入了解MySQL中的JSON_ARRAYAGG和JSON_OBJECT函数
在MySQL数据库中,JSON格式的数据处理已经变得越来越常见。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它可以用来存储和表示结构化的数据。MySQL提供了一些功能强大的JSON函数,其中两个关键的函数是JSON_ARRAYAGG和JSON_OBJECT。本文将深入探讨这两个函数的用途、语法和示例,以帮助您更好地理解它们的功能和用法。
56 1
深入了解MySQL中的JSON_ARRAYAGG和JSON_OBJECT函数
|
25天前
|
Oracle 关系型数据库 MySQL
Mysql 中函数ifnull()实现oracle nvl()函数
Mysql 中函数ifnull()实现oracle nvl()函数
|
27天前
|
存储 SQL 关系型数据库
MySQL存储过程与函数精讲
MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。
17 0
|
2月前
|
SQL Oracle 关系型数据库
测一测自己的Sql能力之MYSQL的函数会造成索引失败
继续我们的SQL能力测试专题,今天的题目如下: SQL二:用户表(包含字段有:用户ID[自增]、姓名、性别、民族、出生日期、身份证号) 采用一个SQL语句,查询出: 用户总数,男性人数,女性人数, 民族是汉族的人数,民族是少数民族(非汉族)的人数,出生日期是1995年的人数,没有身份证号的人数
|
2月前
|
关系型数据库 MySQL BI
当前日期获取:深入了解MySQL中的CURDATE()函数
在数据库操作中,获取当前日期是常见的需求,这时可以使用MySQL中的CURDATE()函数。本文将深入探讨CURDATE()函数的用法、示例以及在数据库操作中的应用。
51 0
推荐文章
更多