Com meu entendimento limitado da cláusula de modelo, esperava que as três consultas a seguir retornassem os mesmos resultados porque não há nulos nos dados e as funções são equivalentes:
select *
from (select level k, 100 v from dual connect by level<=2)
model return updated rows
dimension by (k)
measures (v, 0 shr)
rules ( shr[any] = v[cv()]/sum(v)[any] ); --plain sum
/*
K V SHR
---------- ---------- ----------
1 100 0.5
2 100 0.5
*/
select *
from (select level k, 100 v from dual connect by level<=2)
model return updated rows
dimension by (k)
measures (v, 0 shr)
rules ( shr[any] = v[cv()]/nullif(sum(v)[any],0) ); --with nullif
/*
K V SHR
---------- ---------- ----------
1 100 0.25 <------\___ why?
2 100 0.25 <------/
*/
select *
from (select level k, 100 v from dual connect by level<=2)
model return updated rows
dimension by (k)
measures (v, 0 shr)
rules ( shr[any] = v[cv()]/decode(sum(v)[any],0,null,sum(v)[any]) ); -- with decode
/*
K V SHR
---------- ---------- ----------
1 100 0.5
2 100 0.5
*/
O que estou perdendo sobre o processamento de regras que explica esse comportamento?
SQLFiddle aqui
No Oracle Database SQL Language Reference pode-se ler
mas o Oracle 11.2.0.3 no Linux fornece o seguinte
Portanto, isso é (pelo menos uma documentação :-) bug em 11r2
Obtém-se os mesmos resultados no Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - Produção de 64 bits