Sql 函数 - 忽略返回值中的小数位
Sql function - disregarding the decimal place in returning value
为什么sql查询在使用SUM函数时会忽略小数位?
iv'e 使用 CONVERT 函数,但它没有 return 正确的值。
示例:
150.30 * 3 = 450.9
但是根据我函数的结果 return
150.30 * 3 = 451 小数点四舍五入。
我怎样才能得到准确的计算结果...?
这是我的 sql 函数查询
CREATE FUNCTION [dbo].[fnGetSubjectCost](@id INT)
RETURNS DECIMAL
AS
-- Returns the stock level for the product.
BEGIN
DECLARE @ret DECIMAL;
SELECT @ret = IIF([Name] = 'Tuition', CONVERT([DECIMAL](9,2),Cost) * CONVERT([DECIMAL](15,2),t1.SubjectUnit), CONVERT([DECIMAL](9,2),Cost))
FROM [HCCDB].[dbo].[SubjectOfferedFee] AS t0
INNER JOIN HCCDB.dbo.SubjectsOffered AS t1
ON t1.SubjectsOfferedID = t0.SubjectsOfferedID
WHERE t0.SubjectOfferedFeeID = @id
IF (@ret IS NULL)
SET @ret = 0;
RETURN CONVERT(DECIMAL(15,2), @ret);
END;
查询有效,但没有 return 确切值。它忽略小数位。
此函数的用途是添加列公式。
ALTER TABLE HCCDB.dbo.SubjectOfferedFee
ADD FinalCost AS CONVERT(DECIMAL(15,2), dbo.fnGetSubjectCost(CONVERT(INT, [SubjectOfferedFeeID])))
问题是 @ret
的声明。
在SQL服务器中,小数的默认小数位是0(见documentation)。所以,
declare @ret decimal;
相当于:
declare @ret decimal(18, 0);
只需明确精度和比例,例如:
declare @ret decimal(18, 2);
为什么sql查询在使用SUM函数时会忽略小数位? iv'e 使用 CONVERT 函数,但它没有 return 正确的值。
示例:
150.30 * 3 = 450.9
但是根据我函数的结果 return
150.30 * 3 = 451 小数点四舍五入。
我怎样才能得到准确的计算结果...?
这是我的 sql 函数查询
CREATE FUNCTION [dbo].[fnGetSubjectCost](@id INT)
RETURNS DECIMAL
AS
-- Returns the stock level for the product.
BEGIN
DECLARE @ret DECIMAL;
SELECT @ret = IIF([Name] = 'Tuition', CONVERT([DECIMAL](9,2),Cost) * CONVERT([DECIMAL](15,2),t1.SubjectUnit), CONVERT([DECIMAL](9,2),Cost))
FROM [HCCDB].[dbo].[SubjectOfferedFee] AS t0
INNER JOIN HCCDB.dbo.SubjectsOffered AS t1
ON t1.SubjectsOfferedID = t0.SubjectsOfferedID
WHERE t0.SubjectOfferedFeeID = @id
IF (@ret IS NULL)
SET @ret = 0;
RETURN CONVERT(DECIMAL(15,2), @ret);
END;
查询有效,但没有 return 确切值。它忽略小数位。
此函数的用途是添加列公式。
ALTER TABLE HCCDB.dbo.SubjectOfferedFee
ADD FinalCost AS CONVERT(DECIMAL(15,2), dbo.fnGetSubjectCost(CONVERT(INT, [SubjectOfferedFeeID])))
问题是 @ret
的声明。
在SQL服务器中,小数的默认小数位是0(见documentation)。所以,
declare @ret decimal;
相当于:
declare @ret decimal(18, 0);
只需明确精度和比例,例如:
declare @ret decimal(18, 2);