SQL | DB2和MySQL分条件求和
为了探究对比DB2和MySQL多条件求和的区别,创建一个示例数据表:
name |
acct |
date |
money |
a |
1 |
20220430 |
15.0 |
a |
2 |
20220430 |
30.0 |
a |
1 |
20220531 |
10.0 |
a |
2 |
20220531 |
25.0 |
a |
3 |
20220531 |
30.0 |
b |
1 |
20220430 |
10.0 |
b |
2 |
20220430 |
20.0 |
b |
3 |
20220430 |
30.0 |
b |
2 |
20220531 |
15.0 |
b |
3 |
20220531 |
50.0 |
c |
1 |
20220430 |
28.0 |
c |
2 |
20220430 |
32.0 |
d |
1 |
20220531 |
44.0 |
d |
2 |
20220531 |
10.0 |
d |
3 |
20220531 |
8.0 |
我们创建一个情形:客户a在四月有两个账户,在5月又新开了一个账户;客户b在四月有三个账户,在5月对其账户1进行了销户;客户c在四月持有两个账户,并在五月全部销户;客户d在四月未持有账户,在五月开了三个账户。这样更加贴近实际。创建数据表及插入数值SQL语句(DB2、MySQL存储语法一致):
--创建数据表
create table test
(name varchar(100),acct varchar(100),date varchar(100),money float)--插入数值insert into test(name,acct,date,money) values('a','1','20220430',15.0),('a','2','20220430',30.0),('a','1','20220531',10.0),('a','2','20220531',25.0),('a','3','20220531',30.0),('b','1','20220430',10.0),('b','2','20220430',20.0),('b','3','20220430',30.0),('b','2','20220531',15.0),('b','3','20220531',50.0),('c','1','20220430',28.0),('c','2','20220430',32.0),('d','1','20220531',44.0),('d','2','20220531',10.0),('d','3','20220531',8.0)
我们想要探索四个客户五月底存款比四月底存款变化了多少(这是一个客户粒度问题),最基础的做法就是进行两个子查询后进行一个左连接,具体SQL语句:
selectt1.name 姓名,t1.month4 四月存款,t2.month5 五月存款,t2.month5 - t1.month4 提升金额
from (select name,sum(money) month4from testwhere date = '20220430'group by name) t1
left join (select name,sum(money) month5from testwhere date = '20220531'group by name) t2
on t1.name = t2.name
order by (t2.month5 - t1.month4) desc
分别在DB2和MySQL运行上述代码,得到结果:
MySQL结果
DB2结果
DB2默认把Null排在前面,而MySQL会把Null排在最后。为了解决DB2的问题,只需在上述代码最后添加 nulls last,即可得到我们想要的结果:
下面考虑下进阶操作,如果在提取数据时,进行分条件求和,可以一定程度上减少编程的篇幅,虽然在这个简单例子上编程篇幅变化的不够明显,但是在实际工作中,我们需要的限制条件会更多,分条件求和一定可以让代码更清爽。
关于数据库条件语句,有CASE和IF,先考虑使用CASE情形,具体SQL语句:
selectname 姓名,sum(case when date='20220430'then money else null end) 四月存款, --这里一定要设null,否则会为四月没有账户的客户创建“账户”sum(case when date='20220531'then money else null end) 五月存款,(sum(case when date='20220531'then money else null end)- sum(case when date='20220430'then money else null end)) 提升金额
from test
group by name
order by (sum(case when date='20220531'then money else null end)- sum(case when date='20220430'then money else null end)) desc (nulls last) --DB2补充括号内内容
将上述代码分别在DB2和MySQL中运行,得到结果:
MySQL结果
DB2结果
用时方面:MySQL从48ms提升到29ms;DB2从41ms降低到51ms。(做个参考而已)
考虑使用IF情形,具体SQL语句:
selectname 姓名,sum(if(date='20220430',money,null)) 四月存款,sum(if(date='20220531',money,null)) 五月存款,sum(if(date='20220531',money,null)) - sum(if(date='20220430',money,null)) 提升金额
from test
group by name
order by (sum(if(date='20220531',money,null)) - sum(if(date='20220430',money,null))) desc
上述代码,只能在MySQL中实现,并且用时比CASE语句快2ms,在DB2中却会报错。在进行分条件求和时,DB2只能使用SUM和CASE结合;MySQL可以用SUM和CASE/IF结合。
SQL | DB2和MySQL分条件求和相关推荐
- mysql 多条件求和_sql多条件求和-sql条件求和-sql求和且和满足条件
sql 根据多条件求和 select 日期, sum(产品数) as 产品数, 姓名 from 表名 group by 日期, 姓名 order by 日期, 姓名 用SQL语句对数据库某字段进行求和 ...
- mysql的条件求和函数_mysql 带条件取count记录数,SUM()函数按条件求和
在做统计报表的时候,通常会用到一些复杂的统计功能,而不是简单的 count(*), sum(abc) 就可以的,这就用到了一些基于条件的统计功能. 带条件取count记录数 参考方法: 统计sub_t ...
- mysql分条件查询--choose
一.问题描述 在完成某个接口时,发现需求是这样的:如果是管理员角色,要查询所有信息:如果是非管理员用户,则按照当前登录用户的类别来进行查询,最简单是拆分成两个sql语句,但是这种写法有点low,还是写 ...
- mysql sumif条件求和_sumif与sumifs条件求和函数详解,小白到大神的必经之路
在日常工作中我们经常需要根据某些条件进行求和,今天就给大家介绍下,Excel中的条件求和函数sumif和sumifs Sumif函数 第一个参数:Range:条件区域,用于条件判断的单元格区域.第二个 ...
- Mysql - 带条件求和(sum)
有的时候我们带条件求某些合计字段,接下来我们一起了解下写法吧 已有表: 例:需要求 age 大于等于 20 的共计 多少 ? 可能有的童鞋,给出以下答案 select sum(age) from t ...
- mysql的条件求和函数_使用SQL语句统计数据时sum和count函数中使用if判断条件的讲解...
首先举个栗子(不想看的话直接下面看总结): order_type:订单类型 open_id:用户唯一标识 SELECT date(create_time) AS '当天日期', sum(real_pr ...
- Mysql按条件求和Sum函数
首先在写这博客的初衷是因为在工作开发过程中遇到了数据汇总问题,并且有的还是按条件汇总,这就有点小麻烦,然而学会使用sum函数之后,这些问题就迎刃而解了.是不是很Nice.好记性不如烂笔头!再此,希望能 ...
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)(四)
整个例子的完整代码如下,VS2008下编译测试通过,本人已通过它实现N个项目,欢迎大家评测,谢谢指教 publicenum DBType ...{ Access, SQL, ...
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)(二)
使用静态工厂模式,通过传入枚举型参数,动态创建访问实例 实现模式上采用基本实现接口,派生类继承基类的虚函数,从而实现代码的耦合较低,有很好的扩展性. publicenum DBType ...{ ...
最新文章
- 搜索不包含关键词_sem竞价代运营丨做竞价推广,关键词匹配才是重点
- Xcode6中使用initWithTitle:title image:image selectedImage:自定义图片
- [EOJ]2019 ECNU XCPC March Selection #1 F
- JPA的双向一对一关联实现示例
- Memento 备忘录 快照模式 MD
- js省市二级联动;)
- 微信小程序后台管理系统(后端)笔记
- 邮件安全风险评估方案
- java 获取IP地址 无法获取到真实的IP地址
- SOP:Ubuntu20安装微信
- python系列笔记--耗子(巨细)
- IjkVideoView的视频宽高比怎么设置
- 普通话转换成方言的语音识别方法
- 使用matplotlib和pywaffle绘制象形图(PictorialBar)
- 使markdown文档中的图片居中
- 获取token的两种方法
- PMP项目管理“人际关系与团队技能”归纳总结
- html邮箱代码怎么写_如何制作一个简单的HTML登录页面(附代码)
- idea2021版本添加上一步和下一步操作到工具栏
- Chapter1.3:控制系统的仿真介绍