0

これは私にとって非常に複雑な状況であり、誰かが私を助けてくれるかどうか疑問に思っていました:

ここに私のテーブルがあります:

Record_no   Type    Solde   SQLCalculatedPmu    DesiredValues
------------------------------------------------------------------------
2570088 Insertion   60          133               133
2636476 Insertion   67          119,104           119,104
2636477 Insertion   68          117,352           117,352
2958292 Insertion   74          107,837           107,837
3148350 Radiation   73          107,837           107,83  <---
3282189 Insertion   80          98,401            98,395
3646066 Insertion   160         49,201            49,198
3783510 Insertion   176         44,728            44,725
3783511 Insertion   177         44,475            44,472
4183663 Insertion   188         41,873            41,87
4183664 Insertion   189         41,651            41,648
4183665 Radiation   188         41,651            41,64   <---
4183666 Insertion   195         40,156            40,145
4183667 Insertion   275         28,474            28,466
4183668 Insertion   291         26,908            26,901
4183669 Insertion   292         26,816            26,809
4183670 Insertion   303         25,842            25,836
4183671 Insertion   304         25,757            25,751

私のテーブルでは、SQLCalculatedPmu列またはdesiredValue列のすべての値が前の値に基づいて計算されます。

ご覧のとおり、SQLcalculatedPMU小数第 3 位の四捨五入に基づいて列を計算しました。ケースは、各線放射で、クライアントが 3 ではなく 2 桁に基づいて次の計算を開始したい場合です (目的の値の列に表示されます)。次の値は再計算されます。たとえば、5 行目の値が小数点以下 2 桁になったため、6 行目が変更されます。単一の放射がある場合はこれを処理できますが、私の場合は多数の放射があり、この場合、小数点以下 2 桁の計算に基づいてすべてが変更されます。

要約すると、手順は次のとおりです。

1 - round the value of the preceding row of a raditaiton and put it in the radiation row. 
2 - calculate all next insertion rows. 
3 - when we reach another radiation we redo steps 1 and 2 and so on 

私はオラクルDBを使用しており、所有者であるため、プロシージャ、挿入、更新、選択を行うことができます。しかし、私は手続きやループに慣れていません。

参考までに、これは SQLCalculatedPmu の式で、2 つの追加の列の価格と数を使用し、これは投資家ごとに累積的にすべての行で計算されます。

  (price * number)+(cumulative (price*number) of the preceeding lines)

私はこのようなことを試しました:

update PMUTemp

    set SQLCalculatedPmu = 
    case when Type = 'Insertion' then
        (number*price)+lag(SQLCalculatedPmu ,1) over (partition by investor
        order by  Record_no)/
        (number+lag(solde,1) over (partition by investor order by Record_no)) 
        else 
        TRUNC(lag(SQLCalculatedPmu,1) over partition by invetor order by  Record_no)) 
    end;

しかし、私はこのエラーを出しました(SQLステートメント中にそれ自体が変更された前の行を見ているからだと思います):

ORA-30486 : window function are allowed only in the SELECT list of a query.

放射線の回数だけ呼び出される手順を作成すればうまくいくのだろうかと思っていたのですが、手順が苦手です

よろしくお願いします。


私のニーズを簡単にするために、 SQLCalculatedPmu 列から始まる DesiredValues 列を用意するだけです。ステップは

1 - on a radiation the value become = trunc(preceding value,2) 
2 - calculate all next insertion rows this  way : (price * number)+(cumulative (price*number) of the preceeding lines). As the radiation value have changed then I need to recalculate next lines based on it
3 - when we reach another radiation we redo steps 1 and 2 and so on 

よろしくお願いします

4

1 に答える 1

0

ここで手順を実行する必要はありません。テーブル内の Radiation 行の SQL 更新を使用すると、これをより迅速かつ確実に行うことができます。

何かのようなもの ..

update my_table t1
set    (column_1, column_2) = 
       (select round(column_1,2), round(column_2,2)
        from   my_table t2
        where  t2.type      = 'Insertion' and
               t2.record_no = (select max(t3.record_no)
                               from   my_table t3
                               where  t3.type      = 'Insertion' and 
                                      t3.record_no < t1.record_no  ))
where  t1.type = 'Radiation'
于 2013-09-05T10:50:34.483 に答える