2017-05-09 6 views
0

同じテーブルの他の列のデータに対して計算を行って一時テーブルの行を更新する必要がある状況があります。同じテーブルの他の列との計算を行うテーブルの列を更新する

私はこの

UPDATE #tempTable 
SET #tempTable.Value_Numeric = reim.cmi 
FROM #tempTable t 
     INNER JOIN (SELECT t1.Value_Numeric AS IPAllw , 
          t2.Value_Numeric AS IPElig , 
          t1.Value_Numeric/NULLIF(t2.Value_Numeric,0) AS cmi , 
          t1.WorkingID 
        FROM #tempTable t1 
          JOIN #tempTable t2 ON t1.WorkingID = t2.WorkingID 
                AND t1.order = 78 
                AND t2.order = 74 
        GROUP BY t1.WorkingID , 
          t1.Value_Numeric , 
          t2.Value_Numeric 
        ) reim ON reim.WorkingID = t.WorkingID 
WHERE t.order = 79 

のような分裂を行うことができた私は何をすべき 以下のような複雑なものは

UPDATE t 
SET t.Value_Numeric = ((t.row9-((1-t.row28)*t.row26))/((1-t.row91))/(t.row33)-t.row85) 
FROM #tempTable t 
where t.order = 93 

** t.row9 means t.Value_Numeric where t.order = 9 

で除算し、合計のためにこれを行うことができたではなく、複雑な計算を更新するためのクエリを理解する手助けをしてください。

おかげ

+1

どのDBMS、どのバージョンですか?テーブルスキーマ?インデックス?最小、完全、再現可能な例?サンプルデータを入力しますか?期待される結果?あなたが知っていることを私たちが知っていることを期待しないでください。私たちはあなたが何を書いているかだけを知っ – flutter

+0

表示されているコードは有効なPL/SQLではありません(質問にタグを付けました)。あなたは本当に何を使っていますか?私は 'plsql'タグを削除しました。 –

答えて

0

は、私が質問に与えられたPLSQLタグに基づいて私の答えでOracleを前提としています。

一つの可能​​な解決策は、以下のようにヘルパー関数を作成するには、次のようになります。指定された行が見つからない場合

create or replace function get_temptable_value(p_row in number) return temptable.value_numeric%type 
is 
    pragma AUTONOMOUS_TRANSACTION; 
    v_val temptable.value_numeric%type; 
begin 
    begin 
    select value_numeric 
    into v_val 
    from temptable 
    where row_order = p_row; 
    exception 
    when no_data_found then 
     v_val := null; 
    end; 

    return v_val;  
end; 

関数はnullを返しますが、あなたの要件に応じて0を返すために良いかもしれません。自律プラグマは、更新ステートメント(それ以外の場合はORA-04091が与えられている)から呼ばれるように、それを可能にします:

update temptable t 
SET t.Value_Numeric = ((get_temptable_value(9)-((1-get_temptable_value(28))* get_temptable_value(26)))/((1- get_temptable_value(91)))/(get_temptable_value(33))- get_temptable_value(85)) 
where t.row_order = 93; 

2.別の解決策は、モデルcluaseの使用次のようになります。では

create or replace view temptable_upd 
as 
select * 
from temptable t 
model dimension by (row_order) 
     measures (value_numeric, value_numeric as new_value_numeric) 
     rules (new_value_numeric[93] = ((value_numeric[9]-((1-value_numeric[28])* value_numeric[26]))/((1- value_numeric[91]))/(value_numeric[33])- value_numeric[85]) 
      ); 

ルールセクションでは、行間の計算を定義できます。ビューを使用して

、あなたがテーブルを更新することができます。

update temptable t 
set t.value_numeric = (select new_value_numeric from temptable_upd tupd where tupd.row_order = t.row_order) 
where t.row_order = 93; 
0

Create or replace procedure abc Is V_count number; Begin Select ur_calculations o/p into v_count from table ;Update Ur_table set col1 = v_count Where col2 =value;

COMMIT; END;

関連する問題