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?
3 Réponses :
Que diriez-vous d'utiliser replace()
?
select avg(to_number(replace(Total, '$'))) as level_1 from Fulldata
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
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).
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.