2017-11-18 17 views
0

以下は、作業中のストアドプロシージャです。どのようにcase文の下にある繰り返しコードを変数に代入して使用すれば、コーディング行数を減らすことができますか?このプロシージャの目的は、各CASE文のstart_dateおよびend_dateを使用して表を更新することです。ご協力いただきありがとうございます。変数に反復ステートメントを割り当てる

BEGIN 
    UPDATE period x 
    SET start_date = CASE 
     when return_period = 'L3M' then 
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -2 Month)) 
     when return_period = 'YTD' then 
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL 1-MONTH((select max(monthend_date) from returns y 
      WHERE x.account_id=y.account_id)) Month)) 
     when return_period = '1YR_CUM' or return_period = '1YR_ANN' then    
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -11 Month)) 
     when return_period = '2YR_CUM' or return_period = '2YR_ANN' then    
      last_day(date_add((select max(monthend_date) from eturns y WHERE x.account_id=y.account_id),INTERVAL -23 Month)) 
     when return_period = '3YR_CUM' or return_period = '3YR_ANN' then    
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -35 Month)) 
     when return_period = '4YR_CUM' or return_period = '4YR_ANN' then    
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -47 Month)) 
     when return_period = '5YR_CUM' or return_period = '5YR_ANN' then    
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -59 Month)) 
     when return_period = '6YR_CUM' or return_period = '6YR_ANN' then    
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -71 Month)) 
     when return_period = '7YR_CUM' or return_period = '7YR_ANN' then    
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -83 Month)) 
     when return_period = '8YR_CUM' or return_period = '8YR_ANN' then    
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -95 Month)) 
     when return_period = '9YR_CUM' or return_period = '9YR_ANN' then    
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -107 Month)) 
     when return_period = '10YR_CUM' or return_period = '10YR_ANN' then 
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -119 Month)) 
     when return_period = '11YR_CUM' or return_period = '11YR_ANN' then 
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -131 Month)) 
     when return_period = '12YR_CUM' or return_period = '12YR_ANN' then 
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -143 Month)) 
     when return_period = '13YR_CUM' or return_period = '13YR_ANN' then 
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -155 Month)) 
     when return_period = '14YR_CUM' or return_period = '14YR_ANN' then 
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -167 Month)) 
     when return_period = '15YR_CUM' or return_period = '15YR_ANN' then 
      last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL -179 Month)) 
     when return_period = 'SI_CUM' or return_period = 'SI_ANN' then 
      (select min(monthend_date) from returns y WHERE x.account_id=y.account_id) 
     END 
     , 
     end_date=(select max(monthend_date) from returns y WHERE x.account_id=y.account_id) 
     ; 
END  
+0

なぜこれらの値の参照として機能し、 'JOIN'を使うデータベーステーブルを作ることができないのですか?これはSQLの大きな混乱です。 – tadman

答えて

0

これはあなたの繰り返し式である:

last_day(date_add((select max(monthend_date) from returns y WHERE x.account_id=y.account_id),INTERVAL {months} MONTH)) 

唯一の違いは{months}の値です。 まず、私は少し短い式を記述します。

last_day((select max(monthend_date) from returns y WHERE x.account_id=y.account_id) + INTERVAL {months} MONTH) 

をそれから私が唯一{month}一部にCASEを使用します。

UPDATE period x 
SET start_date = last_day((select max(monthend_date) from returns y WHERE x.account_id=y.account_id) + INTERVAL 
     CASE 
      when return_period = 'L3M' then -2 
      when return_period = 'YTD' then -1 
      when return_period = '1YR_CUM' or return_period = '1YR_ANN' then -11 
      when return_period = '2YR_CUM' or return_period = '2YR_ANN' then -23 
      when return_period = '3YR_CUM' or return_period = '3YR_ANN' then -35 
      when return_period = '4YR_CUM' or return_period = '4YR_ANN' then -47 
      # [...] 
     END 
    MONTH), 
    end_date=(select max(monthend_date) from returns y WHERE x.account_id=y.account_id); 

あなたはまた、それをこのように書くことができます。

UPDATE period x 
SET start_date = last_day((select max(monthend_date) from returns y WHERE x.account_id=y.account_id) + INTERVAL 
     CASE return_period 
      when 'L3M'  then -2 
      when 'YTD'  then -1 
      when '1YR_CUM' then -11 
      when '1YR_ANN' then -11 
      when '2YR_CUM' then -23 
      when '2YR_ANN' then -23 
      when '3YR_CUM' then -35 
      when '3YR_ANN' then -35 
      when '4YR_CUM' then -47 
      when '4YR_ANN' then -47 
      # [...] 
     END 
    MONTH), 
    end_date=(select max(monthend_date) from returns y WHERE x.account_id=y.account_id); 
+0

これは素晴らしいです!ありがとうポール。 – Vince

+0

こんにちは、これは私の更新されたストアドプロシージャです。繰り返し表現CASE 'SI_CUM'と 'SI_ANN'を減らす方法はありますか? – Vince