计算正在舍入SQL Server 2012

时间:2015-06-25 19:28:06

标签: calculated-columns decimalformat rounding-error

我正在尝试将一些性能指标计算为SQL中的[RATE],但无论我做什么,我只会得到整数值作为回报。

在我的数据集中,我有一个Numerator和一个Denominator,它们都存储为整数,分为组和子集。根据组和子集计算的速率略有不同。对于组1,计算仅为N / D.对于第2组,计算为(N * 1000)/ D,但计算的子集除外(N * 10000)/ D.

我将查询写成:

SELECT [Group]
      ,[SubSet]
      ,[Numerator] N
      ,[Denominator] D
      ,CASE WHEN D=0 Then NULL
        WHEN [Group]='G1' THEN [N]/[D]
        WHEN [SubSet]='S2' THEN ([N]*10000)/[D]
        WHEN [SubSet] NOT LIKE 'S2%' AND [G] NOT LIKE 'G1%' THEN ([N]*1000)/[D] as [RATE]

无论我做什么,结果变量都是整数。我尝试将RATE格式化为varchardecimalfloat但没有成功。我尝试将N和D的格式更改为varchardecimalfloat。我尝试将公式从(N*1000)/D更改为(N/D)*1000,但仍无效果。

我错过了什么/做错了什么?

3 个答案:

答案 0 :(得分:2)

您遇到的问题是因为SQL正在执行整数除法,它只会返回整数。要获得十进制返回值,您必须至少有一个值作为小数。

试试这个:

(CAST([N] as decimal(12,6))/[D]) * 1000

根据您期望的精确度调整decimal(12,6)12,6将返回小数点后6位数的小数。如果您只想要2个小数位,请使用16,2

如果您想要计算所得的值,则需要在SQL中使用ROUND函数。

舍入到小数点后第二位:

ROUND((CAST([N] as decimal(12,6))/[D]) * 1000, 2)

答案 1 :(得分:1)

您需要使用CAST:

CAST ((N*1000) AS FLOAT) / D

希望这有帮助。

答案 2 :(得分:0)

SELECT (n * 1000.0)会这样做。