乘数值(32,9)列时的SQL Server精度/小数位数

时间:2019-02-25 19:02:54

标签: sql-server tsql

我对数字列的比例有问题。

我们将两列numeric(32,9)QUANTITYSPLIT)相乘,结果总是以numeric(32,6)的形式返回。

如何获取结果为decimal(32,9)

select
    t1.QUANTITY,
    t1.[TURNOVER WITHOUT TAX],
    t2.SPLIT,
    (t1.QUANTITY * t2.SPLIT) as QUANTITY2,
    (t1.[TURNOVER WITHOUT TAX] * t2.SPLIT) as TURNOVER_WITHOUT_TAX2
from 
    SalesPlan t1
right join
    DailyDistr t2 on t1.WEEK = t2.WEEK 
where 
    (t1.[TURNOVER WITHOUT TAX]*t2.SPLIT) > 0

结果

    QUANTITY    TURNOVER WITHOUT TAX    SPLIT   QUANTITY2   TURNOVER_WITHOUT_TAX2
0.210724257 9.770862333 0.300000000000  0.063217    2.931259

有帮助吗?

2 个答案:

答案 0 :(得分:0)

  

如何获取结果为小数(32,9)?

根据本参考文献:Precision, scale, and Length (Transact-SQL)

Operation | Result precision | Result scale *
--------- | ---------------- | --------------
e1 * e2   | p1 + p2 + 1      |  s1 + s2
  

结果的精度和小数位数最大为 38 。如果结果精度大于38,则降低为38 ,并且   减少相应的比例,以防止截断   结果的组成部分。在某些情况下,例如乘法或   除法,比例因子不会减小,保持小数   精度,尽管会增加溢出错误。

     

在乘法和除法运算中,我们需要精度-比例   存储结果不可分割部分的位置。规模可能是   减少使用以下规则:

     
      
  1. 如果整数部分小于32,则结果比例会减小为min(scale,38-(precision-scale)),因为   不能大于38-(精度标度)。结果可能会四舍五入   在这种情况下。
  2.   
  3. 如果比例小于6,并且整数部分大于32,则不会更改比例。在这种情况下,可能会出现溢出错误   如果不适合小数(38,小数位数)
  4.   
  5. 如果刻度大于6并且整数部分大于32,则刻度将设置为6。在这种情况下,整数部分和   小数位数将减少,结果类型为小数(38,6)。结果   可能会四舍五入到小数点后六位,否则将出现溢出错误   如果整数部分不能容纳32位数字,则抛出该数字。
  6.   

第三点准确描述了您遇到的问题。

参考中的实际示例:

select 
cast(0.0000009000 as decimal(30,10)) 
* cast(1.0000000000 as decimal(30,10)) 
-- results as
[decimal(38, 6)]

在这种情况下,精度为61,小数位数为20。小数位数大于6,整数部分(precision-scale = 41)大于32。在乘法规则中,情况为(3),结果类型为{ {1}}。

答案 1 :(得分:0)

两个数字相乘得出numeric(65, 18)。给定MSDN中所述的用于乘法和除法的数字类型规则,乘积的结果小数位转换为6。这是因为整数部分是45位数字,这导致结果转换为强制转换如(38,6)。

要解决此限制,我将列重铸为一个比例,该比例将导致积分部分小于32,但仍然足够大,以使积分部分较小时所应用的规则不会减小比例而不是32。所以最后,我将两个数字都转换为 numeric(32,18),然后将乘积转换为 numeric(32,9)

将数字强制转换为numeric(32,17)可能已经满足整数部分小于32的要求,但是比例尺38 - (precision - scale) => {{1} } = 7分。

38 - (65-34)