之前,结果集显示300.00,当时正如以下所示,正在进行添加 来自两个不同的表柱。
Cast((SELECT Cost FROM Table1 WHERE Id = CD.Id) +
(SELECT RecuritmentCost FROM Table2 WHERE Id = CD.Id)
AS VARCHAR(10))
但我有一些要求在其中一个案例中进行除法操作 我在下面使用的声明导致300.0000000000000
cast((((
SELECT Cost
FROM Table1
WHERE Id = CD.Id
) + (
SELECT RecuritmentCost
FROM Table2
WHERE Id = CD.Id
))/(Select Count(*) from tblEmployee where Id = CD.Id and emptype=2)) AS VARCHAR(18))
这里我使用了varchar(18)因为如果我使用varchar(10)
它会抛出错误错误是“将数字转换为数据类型varchar的算术溢出错误”。
通过使用varchar(18),此错误已被删除,但结果开始显示300.0000000000000
正在进行操作的列的类型为
Cost(decimal(18,2),null)
RecuritmentCost(decimal(18,2), null)
我认为我没有正确地转换事物,但实际上我需要将结果放在字符串中,所以我正在使用
演员为Varchar(18)
。如果发生任何操作,我们能解决这个问题吗?
这两列,它应该返回两个小数位的结果,也就是字符串格式。
答案 0 :(得分:1)
首先,当您对具有不同数据类型的值进行算术运算时,SQL Server将选择它认为结果的最佳数据类型。您的查询是添加2个十进制值,然后除以整数(count(*)
)。然后,您将其投放到varchar
。子查询结果的划分是导致结果改变类型的原因。
我不确定为什么要对varchar
执行转换,只需将结果转换为decimal(18,2)
以保持精度。如果您确实需要varchar
的值,请先将其转换为decimal(18,2)
,然后转换为varchar
:
运行以下测试:
DECLARE @decimalValue DECIMAL(18, 2) = 300.00;
SELECT @decimalValue;
-- 300.00
SELECT CAST(@decimalValue + @decimalValue
/ ( SELECT 3 ) AS VARCHAR(18)) AS ResultOriginal;
-- 400.0000000000000
SELECT CAST(@decimalValue + @decimalValue
/ ( SELECT 3 ) AS DECIMAL(18,2)) AS ResultAsDecimal;
-- 400.00
SELECT CAST(CAST(@decimalValue + @decimalValue
/ ( SELECT 3 ) AS DECIMAL(18,2)) AS VARCHAR(18)) AS ResultAsVarchar;
-- 400.00