case when 运用的一点提醒

对于运用sql 的同学对 case when 肯定很熟悉,这边就不贴出 case when  的语法了,直接上例子说明:

下面是构建的测试数据,插入语句就不附上了。


1.如图所示,结果应该和你想象的没什么不同


2.改变一下SUM 的位置


咦,好像结果完全相同啊,我是不是在忽悠你们啊,嘿嘿

3.那么接下来我们修改一下 条件

pay_sum>=20 and pay_sum<=50,那么结果会是怎么样的呢?


4.我们来看一下 sum 在外面的情况


结果不一样了,那这是什么情况呢,为什么 id  等于 1和2 的时候不一致呢,id 等3 的时候又相同呢,经过观察发现 id 1和2 的第一条记录 都是10 ,也就是说都是不满足

pay_sum>=20这个条件的。我们可以人为上面 语句3   的 执行顺序是这样的,首先对 pay_sum>=20 and pay_sum<=50  的作用仅仅是用来做一个逻辑判断 对应的值是 取还是不取呢?大笑

5.也许有人问,就算第一条不符合条件后面几条还是有符合的条件的呀,这边我们可以来看一下


从这里我们可以看出来,当case when 外层没有对应的聚合函数后面存在group by  的话,只会对分组字段的第一条进行判断。

这样的话上面的执行顺序我们可以总结为:先通过对每个Id 的第一条数据的 pay_sum 进行判断,符合条件的进行聚合,不符合的返回空。


6.我要说明的问题其实已经结束了,但是我们要来确认一个情况, pay_sum>=20 and pay_sum<=50 是不是仅仅作为一个逻辑判断来确定是否聚合还是有 过滤作用。


修改一下pay_sum 的条件


完全没有区别,这也说明了我们上面的猜测是对的,pay_sum 的条件仅仅是用来判断是来判断 是否聚合,对判断聚合的结果没有影响。

上面是我在工作中遇到的一点问题,如果理解有误,欢迎大家帮我指出。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值