对于我们在clients
表格中的每个客户,请显示client id
和last 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.
为什么会这样?
答案 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'