Bạn có thể tạo nhiều bảng ảo với một CTE bằng cách tách các định nghĩa CTE bằng dấu phẩy. Ngoài ra, CTE có thể tham khảo các CTE khác.
Giả sử ep
tất cả các truy vấn này đều giống nhau, bạn có thể làm như sau:
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>