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