IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Diviser deux résultats de sous-requêtes entier vers résultat flottant ? [9.2]


Sujet :

Requêtes PostgreSQL

  1. #1
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut Diviser deux résultats de sous-requêtes entier vers résultat flottant ?
    Bonjour,

    je voudrai obtenir le résultat réel d'une division sur 4 decimale avec un round(......,4)les deux valeurs à diviser sont chacune une sub_query de type select renvoyant un entier naturel j'ai pas compris comment faire J'ai des erreurs de type selon ce que j'essaye comme :

    HINT: No function matches the given name and argument types. You might need to add explicit type casts.
    ou des mensonges comme round function doesn't exists.... etc....

    j'ai besoin de faire très exactement ça :

    create vieuw as select ...................................., (round((select .resultINTEGER......)::float/(select ......resultINTEGER....)::float),4decimales) ..................................from ZEtable ;ou équivalant... mais impossible de trouver la bonne méthode....
    C'est pour envisager une vue.... avec pleins de choses + le prix_au_km

    les deux types de select sont un calcul de km et de prix de materiel pour estimer un prix_au_km
    km est un integer
    prix est un integer

    je reprends ma fidele base de test pour jouer avec la meme structure :

    mais j'arrive pas à formater cette partie là de la requette j'obtiens 2 résultats aussi inutiles l'un que l'autre....à savoir zéro, ou encore des erreur diverses et variées ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    round((select  syntax error
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    perso=# select round(sum(prix_achat)/sum(km),4) from stockvelo ;
     round  
    --------
     0.0000
    (1 row)
     
    perso=#
    forcer le typage ne sert à rien ça génère aussi un rejet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    perso=# select round(sum(prix_achat)::float/sum(km)::float,4) from stockvelo ;
    ERROR:  function round(double precision, integer) does not exist
    LINE 1: select round(sum(prix_achat)::float/sum(km)::float,4) from s...
                   ^
    HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
    perso=#
    ou alors au mieux le formatage est purement et simplement ignoré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    perso=# select ((select sum(prix_achat) from stockvelo)/(select sum(km) from stockvelo))::float ;
     float8 
    --------
          0
    (1 row)
     
    perso=#
    le meilleur résultat de google : le seul cas trouvé avec le même besoin ne fonctionne pas quand je mets mes noms de tables/champs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    perso=# select (select sum(prix_achat::float) from stockvelo)/(select sum(km::float) from stockvelo) ;
          ?column?      
    --------------------
     0.0217211004976263
    (1 row)
     
    perso=# select round((select sum(prix_achat::float) from stockvelo)/(select sum(km::float) from stockvelo),4) ;
    ERROR:  function round(double precision, integer) does not exist
    LINE 1: select round((select sum(prix_achat::float) from stockvelo)/...
                   ^
    HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
    perso=#perso=# select cast(DATA1.sum1 as float)/cast(DATA2.sum2  as float) from (select round(sum(prix_achat),4) as sum1 from stockvelo) DATA1 , (select round(sum(km),4) as sum2 from stockvelo) DATA2 ;
          ?column?      
    --------------------
     0.0217211004976263
    (1 row)
     
    perso=# perso=# select round(cast(DATA1.sum1 as float),4)/round(cast(DATA2.sum2  as float),4) from (select sum(prix_achat) as sum1 from stockvelo) DATA1 , (select sum(km) as sum2 from stockvelo) DATA2 ;
     
    ERROR:  function round(double precision, integer) does not exist
    LINE 1: select round(cast(DATA1.sum1 as float),4)/round(cast(DATA2.s...
                   ^
    HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
    perso=#ehgefhgtvlbvealmauuo

    Quelle est la bonne façon d'obtenir un résultat réel sur une division de deux entiers resultat chacun d'un sub-query de type select ?


    Merci



    PS: inutile de me dire de modifier les colonnes en décimale, car hors de ma base de test, c'est rigoureusement impossible !!!! les données réellement utilisées viennet d'un automate electromécanique qui ne sait sortir que l'int 16bitset rien d'autre pour l'un des select et pour l'autre c'est une base externe à laquelle on n'aura accès qu'en lecture de toute façon chez chacun des équipementiers concernés, et lanorme entre eux c'est INTEGER !!!!

    PS¹: je viens de voir l'heure.... ça fait donc depuis ce matin que je galère sur ce truc là.... je part dejeuner urgement

    PS²: c'est à s'arracher les testi#!*%$@ avec les dents ce truc ....heureusement que je manque de souplesse !

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Les types float et double precision ont des utilisations très spécifiques, et en informatique de gestion ils sont rarement utiles (j'écris rarement pour ne pas écrire jamais).

    Dans votre cas de figure, des distances et des prix ce type n'est pas adapté à votre besoin.
    Laissez tomber les réels et utilisez des décimaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select round(sum(prix_achat)::decimal / sum(km)::decimal, 4) as prix_au_km
      from stockvelo;

  3. #3
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    ah... merci j'aurai du y penser aux types autres que float.....
    d'ailleur DECIMAL ou NUMERIC ? du coup (visiblement les deux focntionnent)

    en tout cas MERCI je vais pourvoir adapter à ma requette/besoin

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    C'est le même type avec deux noms différents.

    Plus d'informations dans la documentation :
    http://postgresql.developpez.com/doc...-numeric-table

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SI la sous-requête retourne plusieurs résultats, ALORS
    Par italia57 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 17/09/2014, 14h45
  2. Sous-requête avec plusieurs résultats souhaités
    Par devlm dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/08/2014, 12h02
  3. Résultat avec sous requêtes en colonnes
    Par sdelaunay dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/04/2013, 11h30
  4. [MySQL] Utiliser le résultat d'une requête donnant plusieurs résultats
    Par Invité dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 01/02/2008, 15h58
  5. Requête sur les résultats d'une requête
    Par kiro57 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 17/10/2007, 17h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo