我弄了点测试数据试了一下是OK的。
create table aa(
xybh varchar2(20),
xm varchar2(20),
jdrq number(8),
zxrq number(8),
xkdm varchar2(20)
);
create table bb(
hkrq number(8),
xybh varchar2(20),
hqxkdm varchar2(20),
hhxkdm varchar2(20)
);
insert into aa values('zhangsan','张三',20160101,20160801,'shuxue');
insert into aa values('lisi','李四',20160105,20160601,'shuxue');
insert into aa values('wangwu','王五',20160201,20160501,'yuwen');
insert into aa values('liuer','六二',20160108,20160301,'huaxue');
insert into aa values('dahai','大海',20160101,20160801,'huaxue');
insert into bb values(20160201,'zhangsan','shuxue','yuwen');
insert into bb values(20160301,'zhangsan','yuwen','huaxue');
insert into bb values(20160401,'zhangsan','huaxue','shuxue');
insert into bb values(20160205,'dahai','huaxue','yuwen');
insert into bb values(20160205,'wangwu','yuwen','shuxue');
commit;
select n1.tjrq 统计日期,
n1.cur_xkdm 学科,
n1.org_cnt 原有人数,
n1.xy_cnt 当填留有人数,
n1.new_cnt 新学员数,
n1.leave_cnt 退学员数,
nvl(n2.zr_cnt, 0) 转入学员数,
nvl(n3.zc_cnt, 0) 转出学员数
from (select tjrq,
cur_xkdm,
count(case when k.stsrq<k.tjrq and k.zxrq > k.tjrq then 1 end) org_cnt,
count(case
when k.zxrq > k.tjrq then
1
end) xy_cnt,
count(case
when k.jdrq = k.tjrq then
1
end) new_cnt,
count(case
when k.zxrq = k.tjrq then
1
end) leave_cnt
from (select s.xybh,
s.stsrq,
c.tjrq,
s.cur_xkdm,
s.zxrq,
s.jdrq,
row_number() over(partition by s.xybh, c.tjrq order by s.stsrq desc) rn
from (select a.xybh,
a.jdrq stsrq,
a.xkdm cur_xkdm,
a.zxrq,
a.jdrq
from aa a
union
select a.xybh,
b.hkrq stsrq,
b.HHXKDM cur_xkdm,
a.zxrq,
a.jdrq
from aa a, bb b
where a.xybh = b.xybh) s,
(select to_char(to_date('20160101', 'YYYYMMDD') +
rownum - 1,
'YYYYMMDD') tjrq
from dual
connect by rownum <= 365) c
where s.stsrq(+) <= c.tjrq) k
where k.rn = 1
group by tjrq, cur_xkdm) n1
left join (select hkrq, hhxkdm, count(*) zr_cnt
from bb
group by hkrq, hhxkdm) n2
on n1.tjrq = n2.hkrq
and n1.cur_xkdm = n2.hhxkdm
left join (select hkrq, hqxkdm, count(*) zc_cnt
from bb
group by hkrq, hqxkdm) n3
on n1.tjrq = n3.hkrq
and n1.cur_xkdm = n3.hqxkdm
order by 1, 2;