Как получить среднее значение данных с $ в строке - PullRequest
0 голосов
/ 25 марта 2019

У меня есть следующий набор данных:

               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 Invalid Number.

select to_char(avg(Total)) level_1
 from Fulldata

Я также пытался использовать следующее с тем же результатом:

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

Есть ли другой способ создать среднее значение этого набора данных и, кроме того, создать среднее значение за 5 лет только за последние 5 лет?

Ответы [ 3 ]

1 голос
/ 25 марта 2019

Вы можете использовать опцию nls_numeric_characters для функции to_number

select avg(to_number('$112.05', 'fm$999G999D99', 'nls_numeric_characters=''.,'''))  
       as level_1
  from Fulldata
0 голосов
/ 25 марта 2019

Вы можете преобразовать число в явную модель формата, которая учитывает знак валюты, затем получить среднее значение, а затем преобразовать обратно в строку:

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 ввторой).

дБ <> скрипка

0 голосов
/ 25 марта 2019

Как насчет использования replace()?

select avg(to_number(replace(Total, '$'))) as level_1
from Fulldata
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...