Group by分组,为分组后的数据添加序号

需求如下:

根据两个日期区间查询出两个查询列表,表1、表2。并根据日期,以及名称进行group by,并合并数量本期数量、同期数量。其中查询出来的数据,可能表2不存在表1的日期,所以不能用时间来合并数据。

SQL代码如下:

select 
t.cyr,t.orders,t.date,
sum(case when t.b_cn ='b_cn' then 0 else t.b_cn end) b_cn,
sum(case when t.t_cn ='t_cn' then 0 else t.t_cn end) t_cn
from (select a.cyr,a.rownum orders,a.date,a.b_cn,'t_cn' from (select b.*,@rownum:=case when @cyr=b.cyr then @rownum+1 else 1 end rownum,@cyr:=b.cyr  from (select cyr,right(date,2)+0 date,sum(jcn) b_cn from tables_1
where date between '2021-03-01' and '2021-03-31'  group by cyr,date) b,(select @rownum:=0,@cyr:=null) r)a
union all
select b.cyr,b.rownum orders,b.date,'b_cn',b.t_cn from (
select b.*,@rownum:=case when @cyr=b.cyr then @rownum+1 else 1 end rownum,@cyr:=b.cyr  from (select cyr,right(date,2)+0 date,sum(jcn) t_cn from tables_1
where date between '2020-03-01' and '2020-03-31'  group by cyr,date) b,(select @rownum:=0,@cyr:=null) r) b) t group by cyr,orders

SQL语句拆解

1、先查询出需要进行排序的语句,作为临时的主体表。
SQL1:

select b.*,@rownum:=case when @cyr=b.cyr then @rownum+1 else 1 end rownum,@cyr:=b.cyr  from (select cyr,right(date,2)+0 date,sum(jcn) t_cn from tables_1
where date between '2020-03-01' and '2020-03-31'  group by cyr,date) b,(select @rownum:=0,@cyr:=null) r

2、再使用
select @rownum:=0,@cyr:=null
设置默认行号以及临时字段
3、最后使用CASE WHEN 语句,判断表中的cyr是否等于@cyr。
再对@rownum进行逻辑计算即可。
@rownum:=case when @cyr=b.cyr then @rownum+1 else 1 end

由于需要进行对比,查询条件也不一样,所以使用union all拼接。
但是若直接拼接的话,就没办法区别哪个是当期的,哪个是同期的。
所以两个SQL语句中,都添加了一个临时的字段。

case when t.b_cn ='b_cn' then 0 else t.b_cn en
再使用语句将其转换,再对数据进行合并,即可获取到正确的数据。

以上的工作中遇到的需求简化。
此前以运用其他的方法完成了该需求,但是效率感人,容错率较低。
所以采取本方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值