Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server:Precisão/escala decimal estão produzindo resultados estranhos


A documentação está um pouco incompleto quanto à mágica do valor 6 e quando aplicar o max função, mas aqui está uma tabela de minhas descobertas, com base nessa documentação.

Como diz, as fórmulas para a divisão são:

E, como você mesmo destaca, temos então a nota de rodapé:

Então, aqui está o que eu produzi na minha planilha:
p1 s1 p2 s2 prInit srInit prOver prAdjusted srAdjusted
38 16 38 16 93     55     55     38         6
28 16 28 16 73     45     35     38         10
29 16 29 16 75     46     37     38         9

Então, estou usando pr e sr para indicar a precisão e escala do resultado. O prInit e srInit fórmulas são exatamente as forumlas da documentação. Como podemos ver, em todos os 3 casos, a precisão do resultado é muito maior que 38 e assim se aplica a nota de rodapé. prOver é apenas max(0,prInit - 38) - quanto temos que ajustar a precisão se a nota de rodapé se aplicar. prAjustado é apenas prInit - prOver . Podemos ver nos três casos que a precisão final do resultado é 38 .

Se eu aplicar o mesmo fator de ajuste para as escalas, então eu obteria resultados de 0 , 10 e 9 . Mas podemos ver que seu resultado para o (38,16) caso tem uma escala de 6 . Então eu acredito que é onde o max(6,... parte da documentação realmente se aplica. Então, minha fórmula final para srAdjusted é max(6,srInit-prOver) e agora meu Ajustado final os valores parecem corresponder aos seus resultados.

E, claro, se consultarmos a documentação para decimal , podemos ver que o padrão precisão e escala, se você não especificá-los, são (18,0) , então aqui está a linha para quando você não especificou precisão e escala:
p1 s1 p2 s2 prInit srInit prOver prAdjusted srAdjusted
18 0  18 0  37     19     0      37         19