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 位计算该列。情况是,在每行辐射上,客户希望基于 2 位小数而不是 3 位(在所需值列中表示)开始下一次计算。下一个值将被重新计算。例如,第 6 行将更改,因为第 5 行中的值现在是 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 

我正在使用 oracle 数据库,并且我是所有者,因此我可以制作程序、插入、更新、选择。但我不熟悉过程或循环。

有关信息,这是 SQLCalculatedPmu 的公式,它使用两个额外的 culmns 价格和数量,这是针对每个投资者的每行累积计算的:

  (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.

我想知道是否创建一个将被调用的次数与辐射次数一样多的程序是否可以完成这项工作,但我真的不擅长程序

任何帮助问候,


只是为了让我的需要更简单,我想要的只是让 DesiredValues 列从 SQLCalculatedPmu 列开始。步骤是

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 回答