被遗忘的having

清明节后公司网站搞活动主要功能很简单就是实现一个消费送的功能。比如, 当天消费金额满5000 返回10%,5000 及以下 返 7% 的功能。本身这个功能不是很难,但是  这个功能跟上次的一个 新用户消费送的活动重复了。于是,上面发话说,两个活动只能享受一个 。于是乎 问题来了。 在做排除的时候我先用的是 not in , 就是先查出满足条件的 所有用户 然后在查出今天已经送过的用户用not in 对比,其实这样的思路很正常。但是忘记考虑效率问题了、写完之后负责人一看, 说:不行, 你这写的太麻烦了,执行效率很慢,优化优化吧。。

 本身对SQL 的执行效率就不 是很了解。想了各种办法 ,但是都说执行效率慢。 实在没招了,就要放弃的时候,老同事说让我跟另外一个新同事商量商量。就去问问了问她的思路。其实这不是她的任务 估计她也没多想,商量了半天 她也没什么好主意。但是虽然说她 没给解决办法,但是经过跟她这么一说 还真是有了新思路

 1  select o.initiate_user_id, nvl(sum(o.money), 0) totalMoney,case when nvl(sum(o.money), 0) >= 5000 then  10 else  7 end precent,o.initiate_username
 2          from tb_order o
 3          where o.bonus_status = 4
 4            and o.print_status = 2
 5            and o.quash_type = 0
 6            and to_char(o.buy_time, 'yyyy-MM-dd') = to_char(sysdate - 1, 'yyyy-MM-dd')
 7            /*and to_char(o.buy_time, 'yyyy-MM-dd') = to_char(sysdate - 1 - 3, 'yyyy-MM-dd')  ----测试数据*/
 8            and o.lottery_id = 82  
 9          group by o.initiate_user_id, o.initiate_username
10          having (select count(f.change_id) from b_fund_chng f
11                 where f.change_type = 1
12                   and f.reason_type = 48
13                   and f.reason_id = o.initiate_user_id || to_char(sysdate, 'yyyyMMdd')
14                   /*and f.reason_id = o.initiate_user_id || to_char(sysdate - 3, 'yyyyMMdd') ----测试数据*/
15                   )<1
16          order by totalMoney desc;
View Code

这里百度了一下 having的用法:

 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

在这里写一个简单 的 sql 语句

select em_id, sum(gl_limit),SUM(gl_already_get) from t_get_limit group by em_id having sum(gl_limit)>60
原文地址:https://www.cnblogs.com/zplvpp520/p/3654737.html