我有一个会计应用程序。在我的应用程序中,用户可以确定十进制数的数量,因此我不能使用decimal
数据类型,因为它具有固定的精度和比例。
根据这个话题,
Use Float or Decimal for Accounting Application Dollar Amount?,永远不要使用浮点数,因为它只是一个近似值。
因此,我使用VARCHAR(n)
作为我的列的数据类型。
现在,我想在此列上使用SUM
函数,我想要列的确切值。我该怎么办?
答案 0 :(得分:1)
您无法以正常方式对CHAR
数据类型求和。您需要CONVERT
它到一个数字,然后进行计算。
我的建议是转到DECIMAL
,如果最终用户可以更改精度和比例,请考虑您可以拥有的最大值,并让SQL Server将其他数字设为0
例如,如果您选择DECIMAL(19, 4)
并且最终用户选择只有2个比例,则SQL Server将其他两个数字设为0
CREATE TABLE test(mny DECIMAL(18, 4))
INSERT INTO test VALUES (239428394.87)
SELECT * FROM test
OUTPUT
-----------------
239428394.8700
您还可以选择使用MONEY
数据类型。
如果您想使用CHAR
,请尝试以下操作:
DECLARE @precision INT
,@scale INT
,@output VARCHAR(1000)
,@input CHAR(10) = '234234.453'
SELECT @precision = LEN(LEFT(@input, CHARINDEX('.', @input) - 1)) + LEN(SUBSTRING(@input,CHARINDEX('.', @input) + 1, LEN(@input)))
,@scale = LEN(SUBSTRING(@input, CHARINDEX('.', @input) + 1, LEN(@input)))
SELECT @Output = 'SELECT SUM(CONVERT(DECIMAL(' + CONVERT(VARCHAR(100), @precision) + ', ' + CONVERT(VARCHAR(100), @scale) + '), ' + CONVERT(VARCHAR(100), @input) + '))'
SELECT @Output
EXEC (@Output)
您可以动态获取每个数字的精度和比例,并进行动态查询