我有以下数据集:
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年平均值?
答案 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年)。