sql - 两者都在模型子句中的列之间引用

标签 sql oracle

这是我要创建和插入的 SQL:

CREATE TABLE "SYSTEM"."PMUOrdinaireTMP111111"
   ( "IDENTIFIANTACTIONNAIRE" NUMBER(23,0),
  "NUMEROECRITURE" NUMBER(8,0),
  "SENSOPERATION" VARCHAR2(20 BYTE),
  "PRIXREVIENT" NUMBER(19,2),
  "NOMBRETITRES" NUMBER(15,0),
  "SOLDE" NUMBER(20,0)
   ) ;

insert into PMUSALARIAUXTMP111111 values (10,1004848,'I',0,1,1);
insert into PMUSALARIAUXTMP111111 values (10,1123692,'I',721,1,2);
insert into PMUSALARIAUXTMP111111 values (10,1150237,'I',0,1,3);
insert into PMUSALARIAUXTMP111111 values (10,1185011,'I',0,1,4);
insert into PMUSALARIAUXTMP111111 values (10,1377533,'I',703,1,5);
insert into PMUSALARIAUXTMP111111 values (10,1426786,'R',0,5,0);
insert into PMUSALARIAUXTMP111111 values (10,1901940,'I',0,1,1);
insert into PMUSALARIAUXTMP111111 values (10,2172420,'R',0,1,0);
insert into PMUSALARIAUXTMP111111 values (10,2953958,'I',0,1,1);

然后我应用此 SQL 以获得所需的结果:
select IDENTIFIANTACTIONNAIRE,
       NUMEROECRITURE,
       SENSOPERATION,
       NOMBRETITRES,
       PRIXREVIENT,
       Solde,
       PrixRevDevOrigine,
       PrixRevEuro,
       CumulEuro,
       PMUEuro,
       PMUEuroArrondi,
       flag
  from PMUOrdinaireTMP111111
model partition by (IDENTIFIANTACTIONNAIRE)
      dimension by (row_number() over (partition by IDENTIFIANTACTIONNAIRE order by NUMEROECRITURE) rid)
       measures(NUMEROECRITURE,
                SENSOPERATION,
                PRIXREVIENT,
                NOMBRETITRES,
                Solde,
                0 PrixRevDevOrigine,
                0 PrixRevEuro,
                0 CumulEuro,
                0 PMUEuro,
                0 PMUEuroArrondi,
                nvl(last_value(case when SENSOPERATION = 'R'
                                    then 'R'
                               end ignore nulls
                              ) over (partition by IDENTIFIANTACTIONNAIRE order by NUMEROECRITURE),
                    'I'
                   ) flag
               )
rules sequential order
(
PrixRevDevOrigine[any] order by NUMEROECRITURE = case when SENSOPERATION[cv()] = 'R'
                                                      THEN 0
                                                      ELSE PRIXREVIENT[cv()] END,

PrixRevEuro[any] order by NUMEROECRITURE = NombreTitres[cv()]*PrixRevDevOrigine[cv()],  
CumulEuro[any] order by NUMEROECRITURE = case WHEN Solde[cv()] = NombreTitres[cv()] and SENSOPERATION[cv()] = 'I'
                                              THEN NombreTitres[cv()]*PrixRevEuro[cv()]
                                              when SENSOPERATION[cv()] = 'I'
                                              THEN CumulEuro[cv()-1]+PrixRevEuro[cv()]
                                              WHEN SENSOPERATION[cv()] = 'R' THEN PMUEuroArrondi[cv()-1] END ,
PMUEuro[any] order by NUMEROECRITURE = case when Solde[cv()] = 0
                                                      THEN 0
                                                      ELSE CumulEuro[cv()]/Solde[cv()] END,
PMUEuroArrondi[any] order by NUMEROECRITURE = trunc(PMUEuro[cv()],2) 

我希望得到这个结果:
IdentifanActionnaire    NumeroEcriture  SensOperation   NOMBRETITRES    PRIXREVIENT Solde   PrixRevDevOrigine   PrixRevEuro CumulEuro   PMUEuro     PMUEuroArrondi  flag
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      10                   1004848           I             1            0           1           0                   0       0           0           0               I
      10                   1123692           I             1            721         2           721                 721     721         360,5   3   60,5            I
      10                   1150237           I             1            0           3           0                   0       721         240,333333  240,33          I
      10                   1185011           I             1            0           4           0                   0       721         180,25      180,25          I
      10                   1377533           I             1            703         5           703                 703     1424        284,8       284,8           I
      10                   1426786           R             5            0           0           0                   0       0           284,8       284,8           R
      10                   1901940           I             1            0           1           0                   0       0           0           0               R
      10                   2172420           R             1            0           0           0                   0       0           0           0               R
      10                   2953958           I             1            0           1           0                   0       0           0           0               R

但我明白了:
IdentifanActionnaire    NumeroEcriture  SensOperation   NOMBRETITRES    PRIXREVIENT Solde   PrixRevDevOrigine   PrixRevEuro CumulEuro   PMUEuro     PMUEuroArrondi  flag
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
10                      1004848         I               1               0           1       0                   0           0           0           0               I
10                      1123692         I               1               721         2       721                 721         721         360,5       360,5           I
10                      1150237         I               1               0           3       0                   0           721         240,333333  240,33          I
10                      1185011         I               1               0           4       0                   0           721         180,25      180,25          I
10                      1377533         I               1               703         5       703                 703         1424        284,8       284,8           I
10                      1426786         R               5               0           0       0                   0           0           0           0               R
10                      1901940         I               1               0           1       0                   0           0           0           0               R
10                      2172420         R               1               0           0       0                   0           0           0           0               R
10                      2953958         I               1               0           1       0                   0           0           0           0               R

我认为原因是当列“SensOperation”=R 时,CumulEuro 正在调用 PMUEuroArrondi,并且 PMUEuro 也在调用 CumulEuro。很简单,当“SensOperation”=R 时,我只截断之前的 PMUEuroArrondi 值。

最佳答案

1426786 的 PMUEuro 为 0,因为该行的 Solde 为 0,您有

PMUEuro[any] order by NUMEROECRITURE = case when Solde[cv()] = 0 THEN 0

PMUEuroArrondi 只是 trunc()在那。
并不真正取决于 CumulEuro 的值(value)。

关于sql - 两者都在模型子句中的列之间引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18735852/

相关文章:

mysql - 合并 2 个表以产生 1 个输出 - SQL

sql - 这个 SQL IF 对 & 符做了什么?

sql - COMMIT会做什么?

Oracle新手错误: ORA-00904 Invalid identifier when using "case when"

mysql - 表连接顺序会影响查询结果吗?

ios - 构建复杂 NSCompoundPredicate 的最佳方法是什么?

sql - 向我的老板演示 SQL 注入(inject)攻击

mysql - 如何修复丢失的 MySQL 套接字 (Mamp)?

oracle - 如何知道:new in a trigger?的类型

sql - 匹配多个名字