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

SQL Firebird Discussion :

Problème requète SQL et arrondir un champ du select


Sujet :

SQL Firebird

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 31
    Points : 24
    Points
    24
    Par défaut Problème requète SQL et arrondir un champ du select
    Bonjour,
    Quand je fais un select sum(champ) dans une requète simple (sans jointure) ça marche. Quand je veux faire un select sum(champ) dans une requète avec des jointures sur d'autres tables, il me fait une erreur et me dit : invalid column!

    J'ai 3 tables:
    - employé (matricule, nom,prenom)
    - heure (num_id,nombre)
    - temps_passé (matricule,jour,num_id,contrat,date_jour)

    Voila ma requète:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select sum(c.nombre), a.matricule, a.nom, a.prenom, e.contrat
    from employe a, heure c, temps_passe e
    where a.matricule=e.matricule
    and c.num_id=e.num_id
    and extract(year from e.date_jour)=2003
    and e.contrat='Contrat2'
    order by e.matricule_employe, e.contrat
    Cette requète fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select sum(nombre)
    from temps_passe a, heure b
    where a.num_id=b.num_id
    and a.contrat='Contrat2'
    and extract(year from a.date_jour)=2003
    group by a.matricule
    order by a.matricule
    Comment faire pour que ma requète accèpte le sum??

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Les opérateurs d'agrégat (SUM, Count, AVG, Max, Min) fonctionnent avec un critère de regrouppement obligatoirement. sauf exception si la requete ne comporte QUE des agrégats. Autrement dit on ne peux pas mélanger des colonnes 'normales' et des colonnes avec opérations de type sum sans mettre de group by.
    Ceci devrait mieux fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select sum(c.nombre), a.matricule, a.nom, a.prenom, e.contrat 
    from employe a, heure c, temps_passe e 
    where a.matricule=e.matricule 
    and c.num_id=e.num_id 
    and extract(year from e.date_jour)=2003 
    and e.contrat='Contrat2' 
    group by a.matricule, a.nom, a.prenom, e.contrat
    order by e.matricule_employe, e.contrat
    De plus il est préférable d'utiliser une écriture des jointures normalisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select sum(c.nombre), a.matricule, a.nom, a.prenom, e.contrat
    from employe a
      inner join temps_passe e on (a.matricule=e.matricule)
      inner join heure c on (c.num_id=e.num_id)
    where extract(year from e.date_jour)=2003 
      and e.contrat='Contrat2' 
    group by a.matricule, a.nom, a.prenom, e.contrat
    order by e.matricule_employe, e.contrat

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup, ça marche comme il faut.
    Maintenant, je voudrais utiliser la fonction ROUND pour arrondir un nombre pour qu'il soit à seulement 2 chiffres après la virgule. Cette fonction ne fonctionne pas avec InterBase?
    Quelle est la bonne fonction?
    Merci

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Pourquoi Nombre est de quel type ?

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Non, non c'est pas NOMBRE que je veux arrondir. Mais dans ma requète je multiplie NOMBRE avec un prix horaire. Alors je voudrais arrondir ce produit pour ne pas avoir trop de chiffres après la virgule c'est tout.

  6. #6
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    ca ne me dit pas de quel type est prix horaire.

    mais si en faisant une multiplication tu as plus de 2 chiffres apres la virgule je suppose que prix horaire est de type numeric ou decimal avec plus de 2 chiffres apres la virgule.
    Ou pire tu as utilisé un float qui risque fort dans ce cas de te générer des erreurs de calcul.

    Enfin dans un cas comme dans l'autre pour n'avoir en résultat un chiffre sur deux décimale, j'essayerai de caster le résultat en question.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cast(nombre * PrixHoraire as decimal(15,2))

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    PrixHoraire est un numéric et je le multiplie en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PrixHoraire*(1+(44/100))/1819.92
    Tu mets le cast directement dans ta resuète?

  8. #8
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    tu ne fais pas qu'une simple multiplication tu fais des divisions, ce qui explique les multiples décimales.

    sinon oui tu peux mettre cast(PrixHoraire*(1.00+(44.00/100))/1819.92 as decimal(15,2)) dans la select

    Mais vérifie bien les résultats, il se pourrait bien que tu ais des problèmes d'arrondis suivant la façon dont il commence le calcul et surtour la façon dont il détermine le type du résultat de chacun des calculs intermédiaires.

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Je te remercie beaucoup, ça marche nikel!!!!
    C'est vraiment sympa.
    A bientot,
    Missllyss

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

Discussions similaires

  1. [Débutant] Problème requête sql champ DATE
    Par jacko842 dans le forum ADO.NET
    Réponses: 8
    Dernier message: 16/07/2012, 09h24
  2. Problème requête SQL
    Par mandaillou dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/10/2005, 11h37
  3. Problème requête SQL dans page ASP
    Par rocs dans le forum ASP
    Réponses: 14
    Dernier message: 26/07/2005, 15h38
  4. problème requête sql
    Par psychoBob dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/07/2005, 17h50
  5. problème requête sql
    Par perfectdams dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/06/2005, 18h09

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