繁体   English   中英

SQL 小数位前 1 位

[英]SQL 1 Digit Before The Decimal Place

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

在计算人口数据时,我发现了一个奇怪的行为,其中 SQL 似乎需要在小数点前多出 2 位,所以如果我使用DECIMAL(5,4)DECIMAL(6,4)我得到一个Arithmetic overflow error converting int to data type numeric. 错误。 对于除法的一侧,我必须将它推到DECIMAL(7,4) ,然后将整个除法包装在另一个演员表中以获得我实际需要的精度。

SQL 将每个不同的精度视为不同的数据类型,调用转换,因此我意识到在大规模完成时会增加工作量,因为我无法直接转换为我将其存储为的DECIMAL(5,4) 我也只是好奇是什么导致了这种情况。

下面的例子演示了这个问题。 它应该与DECIMAL(2,1) ,但它只能与DECIMAL(3,1) 即便如此,结果仍保留到小数点后 6 位。 任何人都可以至少解释这里发生的事情,并希望有一种方法可以避免它而不会加倍演员吗?

DECLARE @SalesTable TABLE (ProductId INT, Size NVARCHAR(2), Quantity INT)
INSERT INTO @SalesTable VALUES (123, 'S', 5), (123, 'M', 20), (123, 'L', 15), (123, '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

使用额外的小数并产生不同精度的结果

Size    SalesRatio
S       0.100000
M       0.400000
L       0.300000
XL      0.200000

我真的不明白你的困惑。 在您的示例中, 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,147,483,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), (123, 'L', 15), (123, '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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM