如何将nvarchar转换为十进制并获得平均值

时间:2014-03-11 15:12:13

标签: sql sql-server select group-by

我有一个包含8列的数据库表。第一列是客户名称,其他列是分数,但它们存储在nvarchar列中(不幸的是)。在nvarchar列中存储小数的原因是,如果客户没有得分,他们会输入逗号(',')。这种情况仅适用于G列。这个逗号给我带来了很多麻烦,因为我正在尝试进行下面的选择

SELECT
GKOD ,
AVG(CAST(CSI as decimal)),
AVG(CAST(A as decimal)),
AVG(CAST(B as decimal)),
AVG(CAST(C as decimal)),
AVG(CAST(D as decimal)),
AVG(CAST(E as decimal)),
AVG(CAST(F as decimal)),
AVG(
    CASE WHEN ISNUMERIC(G) >= 0
    THEN CAST(G AS decimal)
    ELSE 0 END
)
FROM ANALIZ_DATA WHERE (YIL*100+CAST(AY AS INT)) between 201401  AND 201405
GROUP BY GKOD 

对于G栏,我正在尝试检查它是否为数字。但它给出了这个错误

Error converting data type nvarchar to numeric.

我做错了什么?

1 个答案:

答案 0 :(得分:4)

isnumeric会返回01,因此您的情况无效。相反,只需与1进行比较:

AVG(CASE WHEN ISNUMERIC(G) = 1
    THEN CAST(G AS decimal)
    ELSE 0 END
)

此外,您确定要对0使用值else吗?这会将非数字值视为0,而不是忽略它们。您可能只想将它们视为NULL

AVG(CASE WHEN ISNUMERIC(G) = 1
    THEN CAST(G AS decimal)
    END
)

我也倾向于包含精度和比例参数,而不是依赖于默认值。