说明:
使用开窗函数,在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
效果: