您會認爲您的代碼可行。但是,SQL Server不保證SELECT
的轉換髮生前WHERE
子句篩選數據庫。在我看來這是一個錯誤。在微軟看來,這是一項優化功能。
因此,您的WHERE
不能保證工作。即使使用CTE也不能解決問題。
最好的解決辦法是在SQL Server 2012+ TRY_CONVERT()
可供選擇:
SELECT AVG(TRY_CONVERT(DECIMAL(18,2), Reimbursement)) AS Amount
FROM Database
WHERE ISNUMERIC(Reimbursement) = 1 AND Reimbursement IS NOT NULL;
在早期版本中,你可以使用CASE
。該CASE
確實保證條款的順序排序,所以:
SELECT AVG(CASE WHEN ISNUMERIC(Reimbursement) = 1 AND Reimbursement IS NOT NULL
THEN CONVERT(DECIMAL(18,2), Reimbursement))
END)
FROM Database;
因爲AVG()
忽略NULL
值,該WHERE
是沒有必要的,但你可以包括,如果你喜歡。
alter database add Reimbursement_Value as
(CASE WHEN ISNUMERIC(Reimbursement) = 1 AND Reimbursement IS NOT NULL
THEN CONVERT(DECIMAL(18,2), Reimbursement))
END);
然後,你可以寫代碼:
select avg(Reimbursement_Value)
from database
where Reimbursement_Value is not null;
好像你在該列中一些非數值
最後,你可以通過使用計算列簡化代碼... – jarlh
您正在使用哪個版本的SQLServer? – TheGameiswar