SQL Server - 平均有时包含数字,有时包含字符串的列

时间:2017-09-14 15:20:39

标签: sql-server sql-server-2008 tsql

我正在处理一个设置为nvarchar的列,它有时会有一个数字,我想要平均,有时候是字母,空值或空字符串值。如何获得此列的所有大于0的数值的平均值?

附带问题:如果我想修改列,那么最好的方法是什么,而不会丢失任何数值?

1 个答案:

答案 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;