开窗函数编写序号。双层序号

说明:

使用开窗函数,在sql语句中双层排序,第一层为大排序。所有结果。第二层为小排序,根据操作人,把总数分为若干组,在组内进行排序。

 

先组装了两个table:t1和t2,其中t1由ta+tb+tc外连接组成;t2由td+te外连接组成。

t1和t2内连接组成table1。table1作为公用表表达式CET

table1内使用开窗函数count和rank进行小统计、小排序

外层主查询使用开窗函数count和row_number进行大统计、大查询。

 

之所以没把大小统计放在一层,是因为排序。即小统计是按递增顺序的,而大统计则可能顺序混乱。单独提出来一层,大排序是根据小排序后的结果集,单独排序。

语句:

with table1 as (
select t1.checkmodulename, t1.fname, count(*) over (partition by fname) '个人数',
rank() over(partition by t1.fname order by t1.sglcheckid) '个人序号', t1.sglcheckid,
t1.CHECKDTID, t1.CHECKDATE, t1.INPUTDTID, t1.INPUTDATE,
t2.name, t2.grpname, t2.age, t2.sex, t2.REGISTDATE
from 
(select tc.CHECKMODULENAME, tb.FNAME, ta.SGLCHECKID, 
ta.CHECKDTID, ta.CHECKDATE, ta.INPUTDTID, ta.INPUTDATE from T_SINGLE_CHECKMODULE ta
left join t_emp tb on ta.INPUTDTID = tb.FID left join T_CHECKMODULE tc on ta.CHECKMODULEID = tc.CHECKMODULEID 
where ta.CHECKMODULEID='1412040002' and ta.ISCHECKED = '1') t1
,( select td.[NAME], td.SEX, td.REGISTDATE, td.AGE, te.GRPNAME, td.sglcheckid from T_SINGLE_CHECKINFO td 
left join T_ORDERGROUP te on td.GROUPID = te.GRPID
where  td.CHECKSTATUS<>'1999' and td.ORDERID = '032101017041900001') t2
where t1.SGLCHECKID = t2.SGLCHECKID
) 
select count(*) over() '总数', row_number() over(order by checkmodulename) '总序号', table1.checkmodulename '检查项目', table1.fname '操作人',
table1.个人数, table1.个人序号, table1.sglcheckid '条码号', table1.name '姓名', table1.grpname '项目分组' ,
table1.CHECKDTID '检查人', table1.CHECKDATE '检查时间', table1.INPUTDTID '录入人', table1.INPUTDATE '录入时间',
 table1.age '年龄', case table1.sex when '1' then '男' when '2' then '女' end '性别', table1.REGISTDATE '体检日期'
from table1

效果:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值