1
votes

Comment obtenir la moyenne des données avec un '$' dans la chaîne

J'ai l'ensemble de données suivant:

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

Chacun

En utilisant la requête simple suivante, j'essaie de renvoyer la moyenne de ces nombres mais je continue à obtenir le ORA-01722 Erreur de numéro non valide.

select to_char(avg(Total)) level_1
 from Fulldata

J'ai également essayé d'utiliser ce qui suit avec le même résultat:

               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

Existe-t-il une manière différente de créer la moyenne de cet ensemble de données et, en outre, de créer la moyenne sur 5 ans à partir des 5 dernières années seulement?


1 commentaires

Pourquoi stockez-vous une valeur numérique sous forme de chaîne en premier lieu? Surtout s'ils sont toujours la même devise - mais même s'ils sont différents, il serait probablement plus pratique de stocker la valeur numérique et d'avoir une autre colonne pour indiquer la devise.


3 Réponses :


0
votes

Que diriez-vous d'utiliser replace()?

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


0 commentaires

1
votes

Vous pouvez utiliser l'option nls_numeric_characters pour la fonction to_number

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


0 commentaires

0
votes

Vous pouvez convertir en un nombre avec un modèle de format explicite qui permet le signe de la devise, puis obtenir la moyenne, puis reconvertir en une chaîne:

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

ou plus simplement avec une devise fixe et groupe / caractères décimaux:

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

Si vous ne voulez que la moyenne sur cinq ans de données, filtrez pour cela; soit:

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

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

ou

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

... selon que vous souhaitez inclure l'année en cours (par exemple, 2014- 2018 dans la première version, ou 2015-2019 dans la seconde).

db violon


0 commentaires