计算SQL Server中一行的平均值

时间:2019-01-11 22:00:39

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

我有下表。.percent列的类型为nvarchar

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

我必须计算每行的平均值,这样我才能得到如下结果 数据平均值

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,但是在此之前我尝试过将其设为非数字类型。

谢谢

2 个答案:

答案 0 :(得分:2)

这是您想要的吗?

select dd.*, s.average      
from dashboarddata dd cross apply
     (select avg(try_convert(numeric(10, 2), replace(pc, '%', ''))) as average
      from values (percent1), (percent2), (percent3)) as v(pc)
     ) s;

答案 1 :(得分:2)

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

只需放下%

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

请注意,如果这些值中的任何一个为NULL,则需要考虑到这一点,因为NULL +任何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