sql >> データベース >  >> RDS >> Oracle

クエリを単一のクエリにマージする方法(またはストアドプロシージャの場合もあります)。

    複数の仮想テーブル を作成できます CTE定義をコンマで区切ってCTEを使用します。さらに、CTEは他のCTEを参照できます。

    epを想定 これらすべてのクエリで同じである場合、次のように実行できます。

     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>
    



    1. 連続する行を計算するphpmysql

    2. ajax呼び出しが多すぎるためにブラウザでメモリ不足エラーが発生しないようにする方法

    3. テーブルの最後と最後から2番目のエントリの値を比較するにはどうすればよいですか?

    4. 各ユーザー名が最初に出現したときのMysql更新列