Groupby分组,为分组后的数据添加序号
groupby是什么函数需求如下:
根据两个⽇期区间查询出两个查询列表,表1、表2。并根据⽇期,以及名称进⾏group by,并合并数量本期数量、同期数量。其中查询出来的数据,可能表2不存在表1的⽇期,所以不能⽤时间来合并数据。
SQL代码如下:
select
<,t.orders,t.date,
sum(case when t.b_cn ='b_cn'then0else t.b_cn end) b_cn,
sum(case when t.t_cn ='t_cn'then0else t.t_cn end) t_cn
from(,a.rownum orders,a.date,a.b_cn,'t_cn'from(select b.*,@rownum:=case when@ then@rownum+1else1end rownum,@cyr:=b. cyr from(select cyr,right(date,2)+0date,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
,b.rownum orders,b.date,'b_cn',b.t_cn from(
select b.*,@rownum:=case when@ then@rownum+1else1end rownum,@cyr:=b.cyr from(select cyr,right(date,2)+0date,sum(jcn) t_cn from ta bles_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@ then@rownum+1else1end rownum,@cyr:=b.cyr from(select cyr,right(date,2)+0date,sum(jcn) t_cn from ta bles_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 @ then @rownum+1 else 1 end
由于需要进⾏对⽐,查询条件也不⼀样,所以使⽤union all拼接。
但是若直接拼接的话,就没办法区别哪个是当期的,哪个是同期的。
所以两个SQL语句中,都添加了⼀个临时的字段。
case when t.b_cn ='b_cn' then 0 else t.b_cn en
再使⽤语句将其转换,再对数据进⾏合并,即可获取到正确的数据。
以上的⼯作中遇到的需求简化。
此前以运⽤其他的⽅法完成了该需求,但是效率感⼈,容错率较低。
所以采取本⽅法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论