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

Posted

技术标签:

【中文标题】两者都在模型子句中的列之间引用【英文标题】:Both refer between columns in Model clause 【发布时间】:2013-09-11 08:08:44 【问题描述】:

这是我要创建和插入的 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 值。

【问题讨论】:

【参考方案1】:

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

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

PMUEuroArrondi 就是 trunc()。 并不真正依赖于 CumulEuro 的值。

【讨论】:

以上是关于两者都在模型子句中的列之间引用的主要内容,如果未能解决你的问题,请参考以下文章

where 子句中的列不明确 - 这是啥意思?

如何修复where子句中的聚合?

where 子句中的列“id”不明确

对不在有子句中的列进行分组

sql where子句中的列顺序

ORA-38104: ON 子句中引用的列无法更新