Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/12/2011, 08h57   #1
Membre confirmé
 
Inscription : mai 2005
Messages : 398
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2005
Messages : 398
Points : 208
Points : 208
Par défaut double precision mais pas de chiffres après la virgule

Bonjour,


Je début sous Postgre

J'ai créé un champ rarete de type double precision

alter table releves add column rarete double precision

j'ai mis à jour cette table avec uen donnée de pourcentage mais la valeur retournée ne comporte pas de chiffres après la virgule.


ai-je choisi le bon type de données?
mathieu_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 09h08   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
bonjour,

cf la doc http://www.postgresql.org/docs/9.1/s...e-numeric.html

double precision c'est 15 decimal.

Maintenant avez-vous besoin de 15 décimales ?
Un numeric(2,X) où X est le nombre maximal souhaité, serai plus adéquate.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 13h06   #3
Membre confirmé
 
Inscription : mai 2005
Messages : 398
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2005
Messages : 398
Points : 208
Points : 208
si double precision permet d'afficher 15 décimales, pourquoi ne m'en affiche t il aucune?

j'ai créé une colonne de type numeric(2,2) pour 2 décimales (y a-t-il une écriture plus simple, d'ailleurs)
Code :
ALTER TABLE releves ADD COLUMN rarete numeric(2,2)
Au lancement de la requête
Code :
UPDATE releves SET rarete4 = 100 -(100*nbmaillestaxon/nbmaillesdep)
il me donne
Code :
1
2
3
4
5
6
7
8
9
10
ERREUR:  champ numérique en dehors des limites
DETAIL:  Un champ de précision 2 et d'échelle 2 doit être arrondi à une valeur
absolue inférieure à 1.
 
********** Erreur **********
 
ERREUR: champ numérique en dehors des limites
État SQL :22003
Détail :Un champ de précision 2 et d'échelle 2 doit être arrondi à une valeur
absolue inférieure à 1.
toute aide est la bienvenue.

Désolé pour ces questions qui peuvent paraître évidentes pour les utilisateurs avancés.
mathieu_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 13h26   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Bonjour,


Alors en fait là pgsql va interpréter votre demande assez ...spécialement.

Essyer ceci :
=> 0

et maintenant :
=> 0.07054673721340388007

que c'est-il passé ? dans le 1er cas il va caster votre résultat comme un integer.
Dans le 2eme cas, vu que l'on a mit ".0" il va caster le résultat comme un numeric.

Donc soit vous forcez la caste manuellement avec "CAST(mon_nombre as numeric)" soit vous rajoutez ".0".
Ensuite n'oubliez pas de round votre résultat sinon il y a des chances qu'il tronque tout simplement (je n'ai pas testé, donc à vérifier).

Ce qui nous donne au final :
Code :
1
2
 
UPDATE releves SET rarete4 = 100.0 -(100.0*nbmaillestaxon/nbmaillesdep)
Ceci renvera un résultat de type numeric donc avec une vigule


Citation:
j'ai créé une colonne de type numeric(2,2) pour 2 décimales (y a-t-il une écriture plus simple, d'ailleurs)
Non il n'y a pas plus simple comme écriture.

Par contre vous pouvez créer un domain qui sera de type numeric(2, 2), et ce domain sera ré-utilisable de partout dans votre schéma.


Code :
1
2
3
 
CREATE DOMAIN d_pourcentage
   AS numeric(2,2);
Code :
1
2
 
CREATE TABLE t_pct (mon_nbr d_pourcentage);
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 13h38   #5
Membre confirmé
 
Inscription : mai 2005
Messages : 398
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2005
Messages : 398
Points : 208
Points : 208
merci beaucoup pour toutes ces informations. c'est nickel!

j'en apprends, des choses, d'un seul coup
mathieu_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 16h38   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Si vous ne voulez pas de décimale, pourquoi ne pas travailler avec les types entiers INT ( =/ - 2 milliards) ou BIGINT (+/-2^63) ???

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 19h43   #7
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 291
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 291
Points : 2 738
Points : 2 738
Citation:
Envoyé par mathieu_r Voir le message
si double precision permet d'afficher 15 décimales, pourquoi ne m'en affiche t il aucune?

j'ai créé une colonne de type numeric(2,2) pour 2 décimales (y a-t-il une écriture plus simple, d'ailleurs)
NB
numeric(2,2) ne permet pas de stocker des nombres de 0.00 à 1.00 mais de 0.00 à 0.99 : 100% (1.00) ne peut pas être exprimé dans ce format.

maintenant si ce que vous voulez stocker ce sont des % [0.; 100.0] avec une précision de 2 décimales c'est numeric(5,2) que vous devez utiliser, éventuellement avec une contrainte "check(rarete >= 0.0 and rarete <= 100.0)".

(ou utiliser un autre format numérique que "numeric(precision, scale)" …)
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 23h33   #8
Nouveau Membre du Club
 
Homme Franck Theeten
Inscription : mars 2005
Messages : 33
Détails du profil
Informations personnelles :
Nom : Homme Franck Theeten
Localisation : Belgique

Informations forums :
Inscription : mars 2005
Messages : 33
Points : 27
Points : 27
Le casting peut être aussi utilisé sous cette forme plus courte pour forcer la précision vers les décimales.

Code :
INSERT INTO test_precision (valeur) VALUES (15/100::double precision );
Insère bien 0.15.

L'avantage est que la valeur entrée par l'utilisateur n'est pas altérée et que le CAST n'est indiqué qu'une seule fois pour toute l'expression. Utile si un script effectue l'insertion. C'est vrai que ce n'est un comportement pas très consistant, PostgreSQL pourrait caster par défaut en écriture dans le type du champs...
CetTer est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h44.


 
 
 
 
Partenaires

Hébergement Web