无法将char值转换为smallmoney

时间:2014-03-13 07:33:02

标签: sql-server-2008 tsql

对于我们在clients表格中的每个客户,请显示client idlast name。如果客户的动物去年有任何考试,则会显示考试的平均费用和考试的最高费用。平均费用和最高费用的格式为小数点后两位数(使用str函数)。显示字符串'没有考试'如果没有考试。这可能是因为客户没有动物,或者因为动物没有考试。按客户端ID排序。

SELECT CL.cl_id AS CL_ID, CL.cl_name_last AS LastName
        ,STR(AVG(CASE WHEN YEAR(EH.ex_date) = YEAR(GETDATE())-1 THEN ED.ex_fee ELSE 'no exams' END),12,2) AS 'AverageFee'
        ,STR(MAX(CASE WHEN YEAR(EH.ex_date) = YEAR(GETDATE())-1 THEN ED.ex_fee ELSE 'no exams' END),12,2) AS 'HighestFee'
    FROM vt_clients AS CL
    INNER JOIN vt_animals AS AN ON CL.cl_id = AN.cl_id
    LEFT JOIN vt_exam_headers AS EH ON AN.an_id = EH.an_id
    LEFT JOIN vt_exam_details AS ED ON EH.ex_id = ED.ex_id
    GROUP BY cl.cl_id, CL.cl_name_last

我收到此错误。

Msg 293, Level 16, State 0, Line 1
Cannot convert char value to smallmoney. The char value has incorrect syntax.

为什么会这样?

1 个答案:

答案 0 :(得分:0)

当您执行其中包含case语句的查询时,必须确保为每个可能的输入返回相同的数据类型,或者至少返回可相互转换的数据类型。

在您的查询中,您有两个子句尝试对smallmoney实例或文字no exams的值执行聚合操作,当然,这些子句不能隐式转换为{ {1}}。您应该使用兼容的值,例如smallmoney

,而不是使用此字面值
0

所以整个查询将是:

STR(AVG(CASE WHEN YEAR(EH.ex_date) = YEAR(GETDATE())-1 THEN ED.ex_fee ELSE 0 END),12,2) AS 'AverageFee'