如何获取字符串中带有“ $”的数据的平均值

时间:2019-03-25 17:48:56

标签: sql oracle

我有以下数据集:

               Year                   Total
               2019                      $.00
               2018                      $.00
               2017                   $110.00
               2016                      $.00
               2015                      $.00
               2014                    $70.00
               2013                    $50.00
               2012                    $50.00
               2011                      $.00
               2010                      $.00

每个

使用以下简单查询,我尝试返回这些数字的平均值,但我继续收到ORA-01722无效数字错误。

select to_char(avg(Total)) level_1
 from Fulldata

我还尝试使用以下方法获得相同的结果:

select to_char(avg(Total), 'L999G999G999D99') level_1
 from Fulldata

是否有其他方法可以创建此数据集的平均值,并且可以创建过去5年的5年平均值?

3 个答案:

答案 0 :(得分:1)

您可以将nls_numeric_characters选项用于to_number功能

select avg(to_number('$112.05', 'fm$999G999D99', 'nls_numeric_characters=''.,'''))  
       as level_1
  from Fulldata

答案 1 :(得分:0)

如何使用replace()

select avg(to_number(replace(Total, '$'))) as level_1
from Fulldata

答案 2 :(得分:0)

您可以使用允许货币符号的显式格式模型转换为数字,然后获取平均值,然后转换回字符串:

select to_char(avg(
  to_number(total, 'L999G999G999D99', 'NLS_NUMERIC_CHARACTERS=''.,'' NLS_CURRENCY=''$''')), 
                   'L999G999G999D99', 'NLS_NUMERIC_CHARACTERS=''.,'' NLS_CURRENCY=''$''') as level_1
from fulldata;

LEVEL_1                  
-------------------------
                   $28.00

或更简单地使用固定的货币和组/小数字符:

select to_char(avg(to_number(total, '$999,999,999.99')), '$999,999,999.99') as level_1
from fulldata;

LEVEL_1         
----------------
          $28.00

如果您只想获取五年以上的平均值,则可以进行过滤;要么:

select to_char(avg(to_number(total, '$999,999,999.99')), '$999,999,999.99') as level_1
from fulldata
where year < extract(year from sysdate)
and year >= extract(year from sysdate) - 5;

LEVEL_1         
----------------
          $36.00

select to_char(avg(to_number(total, '$999,999,999.99')), '$999,999,999.99') as level_1
from fulldata
where year >= extract(year from sysdate) - 4;

LEVEL_1         
----------------
          $22.00

...取决于您是否要包括当年(即第一个版本中的2014-2018年,或第二个版本中的2015-2019年)。

db<>fiddle