【发布时间】:2021-01-05 07:23:24
【问题描述】:
我将总数的比率存储在表格中,因此我知道我只会有 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
【问题讨论】:
标签: sql sql-server sql-server-2008-r2