我正在尝试在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
我该如何解决这个问题?
答案 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.666666
和70
(返回到71和70)。第一个通过在带有十进制文字的COALESCE
表达式中隐式转换为十进制。第二个不是这样,需要进行整数除法。
你应该摆脱所有的COALESCE,因为将NULL视为0将不会给出正确的平均值。如果您希望将值视为十进制值以进行平均,则添加一个CAST。