我对数字列的比例有问题。
我们将两列numeric(32,9)
(QUANTITY
和SPLIT
)相乘,结果总是以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
有帮助吗?
答案 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 ,并且 减少相应的比例,以防止截断 结果的组成部分。在某些情况下,例如乘法或 除法,比例因子不会减小,保持小数 精度,尽管会增加溢出错误。
在乘法和除法运算中,我们需要精度-比例 存储结果不可分割部分的位置。规模可能是 减少使用以下规则:
- 如果整数部分小于32,则结果比例会减小为min(scale,38-(precision-scale)),因为 不能大于38-(精度标度)。结果可能会四舍五入 在这种情况下。
- 如果比例小于6,并且整数部分大于32,则不会更改比例。在这种情况下,可能会出现溢出错误 如果不适合小数(38,小数位数)
- 如果刻度大于6并且整数部分大于32,则刻度将设置为6。在这种情况下,整数部分和 小数位数将减少,结果类型为小数(38,6)。结果 可能会四舍五入到小数点后六位,否则将出现溢出错误 如果整数部分不能容纳32位数字,则抛出该数字。
第三点准确描述了您遇到的问题。
参考中的实际示例:
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)