我正在处理一个设置为nvarchar的列,它有时会有一个数字,我想要平均,有时候是字母,空值或空字符串值。如何获得此列的所有大于0的数值的平均值?
附带问题:如果我想修改列,那么最好的方法是什么,而不会丢失任何数值?
答案 0 :(得分:3)
不是防弹但应该有效:
WITH cte AS (
SELECT *
FROM your_tab
WHERE ISNUMERIC(col) = 1
)
SELECT AVG(CAST(col AS DECIMAL(18,2))) AS average
FROM cte
WHERE CAST(col AS DECIMAL(18,2)) > 0;
SQL Server 2012+具有很好的TRY_CAST
功能:
SELECT AVG(casted_col) AS average
FROM (
SELECT TRY_CAST(col AS DECIMAL(18,2)) AS casted -- NULL if cannot cast
FROM your_tab
) sub
WHERE casted_col > 0;