Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So führen Sie meine Abfragen zu einer einzigen Abfrage zusammen (oder können eine gespeicherte Prozedur sein..)

Sie können mehr als eine virtuelle Tabelle erstellen mit einem CTE, indem Sie die CTE-Definitionen durch Kommas trennen. Außerdem können CTEs auf andere CTEs verweisen.

Angenommen ep bei all diesen Abfragen gleich ist, können Sie etwa so vorgehen:

 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>