SQL Server 2008舍入和比较问题

时间:2018-02-07 19:29:30

标签: sql-server

我正在尝试在SQL Server 2008中进行比较,作为视图的一部分。代码如下所示:

SELECT
    ROUND(AVG(COALESCE(monthsOld, 0.0)), 0) as AverageAge,
    CASE
        WHEN AVG(COALESCE(monthsOld, 0)) IS NULL
           THEN 0
        WHEN ROUND(AVG(COALESCE(monthsOld, 0)), 0) >= 71
           THEN 9
        ELSE 0
    END AS AverageAgePoints
FROM 
    (SELECT 
         DATEDIFF(month, table1.dateOne, table1.DateTwo) AS monthsOld
     FROM 
         table1)

结果很奇怪:

AverageAge  AverageAgePoints
----------------------------
71.000000   0

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

你可以在这里看到问题

SELECT
avg(COALESCE(monthsOld, 0.0 )),
avg(COALESCE(monthsOld,0))
FROM (SELECT 70 As monthsOld 
      UNION ALL
      SELECT 71
      UNION ALL 
      SELECT 71) t

返回70.66666670(返回到71和70)。第一个通过在带有十进制文字的COALESCE表达式中隐式转换为十进制。第二个不是这样,需要进行整数除法。

你应该摆脱所有的COALESCE,因为将NULL视为0将不会给出正确的平均值。如果您希望将值视为十进制值以进行平均,则添加一个CAST。