ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-04-26 13:57:44  阅读:588  来源: 互联网

标签:case cyr Group cn date 分组 序号 rownum select


需求如下:

根据两个日期区间查询出两个查询列表,表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
再使用语句将其转换,再对数据进行合并,即可获取到正确的数据。

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

标签:case,cyr,Group,cn,date,分组,序号,rownum,select
来源: https://blog.csdn.net/qq_16546235/article/details/116148012

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有