业务中关于数据筛选需要使用特定的SQL,比如,如何关联不同表空间下的数张表,结合聚合函数进行查询、分类、排序、筛选?
案例一:关联人员表、部门表,查询人员归属信息,并根据部门进行分组,根据部门顺序进行排序显示
结果:
如图所示,人员按照所属部门进行聚合、排序。
select * from (
select h.user_id,h.login_name,h.user_name,d.deptname,d.deptcode ,d.show_indx
from his_users h
left join dept_dict d
on h.dept_code = d.deptcode
and d.deptname in('心内科一病区','心内科二病区','呼吸内科','消化内科一病区')
-- where rownum >=1 and rownum <=500
group by h.user_id,h.login_name,h.user_name,d.deptname,d.deptcode,d.show_indx
order by d.show_indx asc
)
where rownum <=300
Tips: group by 要写在order by 之前,且select后的列需要出现在聚合函数中或group by条件中
案例二:A表空间下表1有2500人,B表空间下表2有900人,找出表2不存在于表1中的人,人员ID为主键。
结果:
-- 结果集1 minus (结果集 2(小) intersect 结果集 3(大))
-- sys_users 某一部门 结果集 1
(
select u.staff_id user_id,u.user_name,d.dept_name deptname,d.dept_code deptcode
from kyeesys.sys_users u
left join kyeesys.sys_dept d
on u.ward_code = d.dept_code
group by u.staff_id,u.user_name,d.dept_name,d.dept_code
having dept_code =1011100
)
minus
(
-- sys_users 某一部门 结果集 2(小结果集)
select * from(
select u.staff_id user_id,u.user_name,d.dept_name deptname,d.dept_code deptcode
from kyeesys.sys_users u
left join kyeesys.sys_dept d
on u.ward_code = d.dept_code
group by u.staff_id,u.user_name,d.dept_name,d.dept_code
having dept_code =1011100
)
intersect
-- his_users 某一部门 结果集 3(大结果集)
(
select h.user_id,h.user_name,d.deptname,d.deptcode
from his_users h
left join dept_dict d
on h.dept_code = d.deptcode
and d.deptname in('神经内科一病区')
group by h.user_id,h.user_name,d.deptname,d.deptcode
having deptcode=1011100
)
)
Tips: 使用了minus(差),intersect(交集),having在group by筛选后使用,where在group by之前使用
持续更新……2019年11月15日 11:13:24