Você pode criar mais de uma tabela virtual com um CTE separando as definições de CTE com vírgulas. Além disso, os CTEs podem se referir a outros CTEs.
Assumindo
ep
é o mesmo em todas essas consultas, você pode fazer algo assim: with ep as
(select emp_cd,
emp_num,
to_char(pay_dt,'yyyymm') as pay_month,
max(code),
max(bill) as bill,
max(chrg) as charge,
sum( nvl(pay_1,0)) sum_pay1,
sum(nvl(pay_2, 0)) sum_pay2,
(chrg_mon*22)+ (chrg_week*5)+ chrg_day as days,
from emp_payments
where emp_cd in ('HP','2000')
and code in ('X','Y','Z')
group by emp_cd,
emp_num,
to_char(pay_dt,'yyyymm'),
code
),
chrg_orig (<field names here>) as (
select emp_cd,
emp_num,
pay_month,
max(code),
sum(bill)
case when sum(days)=22 then sum(chrg) else round((round(sum(chrg)/sum(days),4)*22),2) end as chrg_orig
from ep
where chrg <>0
group by
emp_cd,
emp_num,
paymonth
),
rate_chrg (<field names here>) as (
select a.emp_cd,a.emp_num,a.key,b.rate as rate_chrg from
(select emp_cd,emp_num,to_char(pay_dt,'yyyymm') as key,max(invc_dt) as invc_dt from ep
where code in ('X','Y') and rate <> 0
group by emp_cd,emp_num,to_char(invc_dt,'yyyymm')) a,
(select emp_cd,emp_num,to_char(pay_dt,'yyyymm') as key,invc_dt,rate from ep
where code in ('X','Y') and rate <> 0) b
where a.emp_cd = b.emp_cd
and a.emp_num = b.emp_num
and a.key = b.key
and a.invc_dt = b.invc_dt
),
bonus_chrg (<field names here>) as (
select a.emp_cd,a.emp_num,a.key,b.rate as bonus_chrg from
(select emp_cd,emp_num,to_char(pay_dt,'yyyymm') as key,max(invc_dt) as invc_dt from ep
where code in ('Z') and rate <> 0
group by emp_cd,emp_num,to_char(invc_dt,'yyyymm')) a,
(select emp_cd,emp_num,to_char(pay_dt,'yyyymm') as key,invc_dt,rate from ep
where code in ('Z') and rate <> 0) b
where a.emp_cd = b.emp_cd
and a.emp_num = b.emp_num
and a.key = b.key
and a.invc_dt = b.invc_dt
),
comp_days (<field names here>) as (
select emp_cd,emp_num,paymonth as key,sum(days) as comp_days from ep
where code in ('X','Y')
group by emp_cd,emp_num,key
)
SELECT *
FROM ep
LEFT OUTER JOIN chrg_orig
ON <JOIN CONDITION>
LEFT OUTER JOIN rate_chrg
ON <JOIN CONDITION>
LEFT OUTER JOIN bonus_chrg
ON <JOIN CONDITION>
LEFT OUTER JOIN comp_days
ON <JOIN CONDITION>