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
再使用语句将其转换,再对数据进行合并,即可获取到正确的数据。

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

上一篇:mysql @rownum := @rownum+1 方式获取行号


下一篇:创建一个Excel文件