小数点前的SQL 1位数字

问题描述

我将总计的比率存储在表中,因此知道我只有0到1之间的值,而4个小数位足够精度。因此,我将表列创建为DECIMAL(5,4)

在计算人口数据时,我发现一种奇怪的行为,即sql似乎想要在小数点前再加2个位置,因此,如果我使用DECIMAL(5,4)DECIMAL(6,4),则会得到{{1} }错误。我必须将其推到Arithmetic overflow error converting int to data type numeric.分隔线的一侧,然后将整个分隔线包装在另一个转换中,以获得我实际需要的精度。

sql认为每种不同的精度都是不同的数据类型,因此需要进行转换,因此我意识到大规模执行时会增加工作量,因为我无法直接转换为DECIMAL(7,4)进行存储如。我也只是好奇到底是什么原因引起的。

下面的示例演示了该问题。它应与DECIMAL(5,4)一起使用,但仅与DECIMAL(2,1)一起使用。即使这样,结果仍保留到小数点后6位。谁能至少解释一下这里发生的事情,并希望在不增加演员人数的情况下避免这种情况发生?

DECIMAL(3,1)

使用多余的小数并产生不同精度的结果

DECLARE @SalesTable TABLE (ProductId INT,Size NVARCHAR(2),Quantity INT)
INSERT INTO @SalesTable VALUES (123,'S',5),(123,'M',20),'L',15),'XL',10)

SELECT Size,sales.Quantity / CAST(sales.Total AS DECIMAL(3,1)) AS SalesRatio
FROM (
    SELECT Size,Quantity,SUM([Quantity]) OVER (PARTITION BY ProductId) AS Total
    FROM @SalesTable
) AS sales

解决方法

我不太了解你的困惑。在您的示例中,salesTotal1的值为50。这要求小数点左边两位。

也许混淆在于小数的内部类型。尽管规则对于乘法而言是复杂的,而对于除法而言却是非常不可思议的,但是对于加法而言,规则则要简单得多:类型不变。

因此,总数需要适合十进制值。

如果您关心算术运算的结果的类型,请转换整个表达式:

SELECT Size,CAST(sales.Quantity * 1.0 / sales.Total AS DECIMAL(3,1)) AS SalesRatio

* 1.0可能不是必需的,但可以确保除法具有小数位。

,

十进制精度应设置为包含计算中包含的最大数字所需的最大长度(除非另外处理)。在这种情况下,数量是数据类型INT,其最小值/最大值为-2 ^ 31(-2,147,483,648)至2 ^ 31-1(2,647)。在所有情况下都可以使用数据类型Decimal(16,4)。任意整数的12位数字+小数点右边的4位。如果将商的分母加或乘以1.0,SQL Server会自动扩展小数精度。像这样

DECLARE @SalesTable TABLE (ProductId INT,Size NVARCHAR(2),Quantity INT)
INSERT INTO @SalesTable VALUES (123,'S',5),(123,'M',20),'L',15),'XL',10)

SELECT Size,cast(sales.Quantity / (sales.Total*1.0) AS DECIMAL(16,4)) AS SalesRatio
FROM (
    SELECT Size,Quantity,SUM([Quantity]) OVER (PARTITION BY ProductId) AS Total
    FROM @SalesTable
) AS sales;

输出

Size    SalesRatio
S       0.1000
M       0.4000
L       0.3000
XL      0.2000