首页 > 解决方案 > 计算 SQL Server 中一行的平均值

问题描述

我有下表..百分比列的类型为 nvarchar

Data  Percent1 Percent2 Percent3
1     3%        4%        6%
2     6%        8%        7%
3     8%        6%        8%

我必须计算每行的平均值,这样我才能得到像 Data Avg 这样的结果

1    4.33%

我试图将 %column 转换为十进制,以便我可以应用平均函数

select
Case WHEN Isnumeric([Percent1]) = 1
THEN CONVERT(DECIMAL(18,2),Replace([Percent1],'%',''))
ELSE 0 END AS Percent1
from DashboardData

但我只是得到 0 值..我猜测外部函数由于某种原因在内部函数之前运行。有人可以告诉我如何实现这一目标。

我知道 IsNumeric 函数会将其设为 0,但在此之前我尝试过,但我得到了一个类型不是数字的异常。

谢谢

标签: sqlsql-serversql-server-2008sql-server-2014

解决方案


SELECT ISNUMERIC('3%')将返回 0,您的所有其他值也将返回 0,因此您的 else 条件将始终是结果。

只需放下%

select
   data, 
   (replace(Percent1,'%','') + replace(Percent2,'%','') + replace(Percent3,'%','')) * 1.0 / 3

请注意,如果NULL您需要考虑这些值中的任何一个,因为NULL+ any IS NULL

另外,你不想ISNUMERIC太重……它会产生一些你可能没想到的结果

select 
    ISNUMERIC('$')      --money which is a numeric value
    ,ISNUMERIC('1e4')   --scientific notation
    ,ISNUMERIC('45D-1') --old scientific notation
    ,ISNUMERIC('.')     --just the decimal portion of a float / decimal

推荐阅读