2014-03-13 58 views
0

對於每個客戶我們在clients表,顯示client idlast name。如果客戶的動物去年有任何考試,則顯示考試的平均費用和考試的最高費用。平均費用和最高費用在小數點後用兩位數字格式化(使用str函數)。如果沒有檢查,顯示字符串'不檢查'。這可能是因爲客戶沒有動物,或者因爲動物沒有考試。按客戶ID排序。無法轉換的char值SMALLMONEY

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

你可能在你的字符串非數值。 – Mihai

+0

謝謝!我刪除了Else的「沒有考試」,瞧!但它不符合作業的標準,即顯示「沒有考試」,而不是現在顯示的是「0.00」。你知道我能做到嗎? 編輯:語法 –

回答

0

當您執行查詢中包含case語句時,必須確保對於每個可能的輸入返回相同的數據類型或至少可以相互轉換的數據類型。

在您的查詢,你有兩個條款,試圖對某個值執行聚合操作,要麼一個smallmoney實例或文字no exams,這當然不能被隱式轉換爲smallmoney。如果不使用這種文字的,應使用兼容的值,例如,0

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

所以整個查詢將是:

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 0 END),12,2) AS 'AverageFee' 
    ,STR(MAX(CASE WHEN YEAR(EH.ex_date) = YEAR(GETDATE())-1 THEN ED.ex_fee ELSE 0 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 
+0

謝謝!雖然這可行,但它不符合分配標準,即顯示「不檢查」而不是0.00。你知道我可以如何正確地做到這一點? –

+2

「返回值的類型由第一個決定」 - 根本不是這樣。所有數據類型都會被考慮,[數據類型優先](http://technet.microsoft.com/en-us/library/ms190309.aspx)用於確定CASE表達式的結果類型。 –

+0

@Damien_The_Unbeliever正確。我的MS-Fu今天似乎沒有了。 – Mureinik