2016-05-26 11 views
4

に基づいて、私は作品のOracleデータベースに対して書かれた以下の選択があります。更新表マルチ参加GROUPBYサブクエリ

SELECT d.REGION_NAME REGION, 'SM' PLAN, b.TRADING_CODE ACCOUNT, c.RM_SM_NAME SM_NAME,'Q116' TIMEPERIOD, 
    SUM(CASE WHEN a.PAYOUT_TYPE = 'BONUS' THEN a.PAYOUT END) as BONUS, 
    SUM(CASE WHEN a.PAYOUT_TYPE = 'MAINTENANCE' THEN a.PAYOUT END) as MAINTENANCE 
FROM FACT_COMM_LARGE_ACCT_BONUS a 
INNER JOIN DIM_TRADING_ACCOUNTS b on b.trading_dwkey = a.trading_dwkey 
INNER JOIN REF_RM_SM_REGION c on c.RM_SM_USER_CODE = a.RM_SM_USER_CODE 
INNER JOIN REF_REGION d on d.REGION_DWKEY = c.REGION_DWKEY 
GROUP BY d.REGION_NAME, 'SM', b.TRADING_CODE, c.RM_SM_NAME; 

を、私は、このデータの結果としたいものを中にBONUSとMAINTENANCEフィールドを更新していますACCOUNTの組み合わせがある別の表| SM_NAME | TIMEPERIODは等しい。

私はUpdateステートメントで遊んでいますが、止まっています。私はSubQueryとWHERE節を2つの異なる方法で使用しようとしました。 1

UPDATE WORK_COMMISSION_SUMMARY_FINAL e 
    SET e.BONUS = (SELECT subqry1.BONUS FROM (
      SELECT d.REGION_NAME REGION, 'SM' PLAN, b.TRADING_CODE ACCOUNT, c.RM_SM_NAME SM_NAME,'Q116' TIMEPERIOD, 
       SUM(CASE WHEN a.PAYOUT_TYPE = 'BONUS' THEN a.PAYOUT END) as BONUS, 
       SUM(CASE WHEN a.PAYOUT_TYPE = 'MAINTENANCE' THEN a.PAYOUT END) as MAINTENANCE 
      FROM FACT_COMM_LARGE_ACCT_BONUS a 
      INNER JOIN DIM_TRADING_ACCOUNTS b on b.trading_dwkey = a.trading_dwkey 
      INNER JOIN REF_RM_SM_REGION c on c.RM_SM_USER_CODE = a.RM_SM_USER_CODE 
      INNER JOIN REF_REGION d on d.REGION_DWKEY = c.REGION_DWKEY 
      GROUP BY d.REGION_NAME, 'SM', b.TRADING_CODE, c.RM_SM_NAME) AS subqry1 
      WHERE subqry1.ACCOUNT = e.Account and subqry1.SM_NAME = e.SM_NAME and subqry1.TIMEPERIOD = e.TIMEPERIOD); 

ウェイ2

UPDATE WORK_COMMISSION_SUMMARY_FINAL e 
    SET e.BONUS = subqry1.BONUS, 
     e.MAINTENANCE = subqry1.MAINTENANCE 
    (SELECT d.REGION_NAME REGION, 'SM' PLAN, b.TRADING_CODE ACCOUNT, c.RM_SM_NAME SM_NAME,'Q116' TIMEPERIOD, 
     SUM(CASE WHEN a.PAYOUT_TYPE = 'BONUS' THEN a.PAYOUT END) as BONUS, 
     SUM(CASE WHEN a.PAYOUT_TYPE = 'MAINTENANCE' THEN a.PAYOUT END) as MAINTENANCE 
    FROM FACT_COMM_LARGE_ACCT_BONUS a 
    INNER JOIN DIM_TRADING_ACCOUNTS b on b.trading_dwkey = a.trading_dwkey 
    INNER JOIN REF_RM_SM_REGION c on c.RM_SM_USER_CODE = a.RM_SM_USER_CODE 
    INNER JOIN REF_REGION d on d.REGION_DWKEY = c.REGION_DWKEY 
    GROUP BY d.REGION_NAME, 'SM', b.TRADING_CODE, c.RM_SM_NAME) as subqry1 
    WHERE subqry1.ACCOUNT = e.ACCOUNT and subqry1.SM_NAME = e.SM_NAME and subqry1.TIMEPERIOD = e.TIMEPERIOD; 

ウェイは、私は、より高度なSQLのものにかなり新しいですし、かなりここで立ち往生しています。私はおそらくそれについて行きたいと思っている方法を複雑にしていますが、誰かが手を貸すことができれば、私はそれを感謝します。

最後に注意しなければならないのは、これは大規模な手順の一部である可能性が高いため、手順を踏む必要がある場合、それが可能な解決策です。

+0

どのデータベースですか? 'PLSQL'タグはOracleを意味しますが、あなたの例にはPL/SQLはありませんので、不明です。 – sstan

+0

@sstan - はい、それはオラクルです(私はちょうど今、おかげで質問を編集しました)。 PLSQLは無関係であることがわかりました。 –

答えて

8

このような更新は、MERGEステートメントで書き込み、読み込み、および保守を行う方が簡単です。 Oracleドキュメント:https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm

merge into work_commission_summary_final e 
    using [**your subquery here**]  subqry1 
    on ( subqry1.account = e.account 
     and subqry1.sm_name = e.sm_name 
     and subqry1.timeperiod = e.timeperiod 
    ) 
when matched 
    then update e.bonus  = subqry1.bonus, 
       e.maintenance = subqry1.maintenance;