如何解决小数点前的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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。