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

Langage SQL Discussion :

Fonctions sur plusieurs tables jointes


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3
    Par défaut Fonctions sur plusieurs tables jointes
    Bonjour,
    Comme dit dans le titre, y a-t-il un moyen d'appliquer des fonctions (COUNT, SUM, etc.) sur plus d'une table jointe dans une seule et même requête ?
    Par exemple, si on veut récupérer les montants totaux des achats et des ventes d'un client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT CLIENTS.NOM, SUM(ACHATS.COUT_TTC), SUM(VENTES.COUT_TTC) FROM CLIENTS
    LEFT JOIN ACHATS ON ACHATS.ID_CLIENT = CLIENTS.ID_CLIENT
    LEFT JOIN VENTES ON VENTES.ID_CLIENT = CLIENTS.ID_CLIENT
    GROUP BY CLIENTS.NOM
    Cette requête multiplie les lignes de ACHATS avec les lignes de VENTES (comme on pouvait s'y attendre).
    Existerait-il un moyen élégant d'obtenir le résultat recherché ?
    Dans l'exemple précédent, un moyen non élégant serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT CLIENTS.NOM, 
      SUM(ACHATS.COUT_TTC) / COUNT(DISTINCT(VENTES.ID_VENTE)), 
      SUM(VENTES.COUT_TTC) /COUNT(DISTINCT(ACHATS.ID_ACHAT))
      FROM CLIENTS
    LEFT JOIN ACHATS ON ACHATS.ID_CLIENT = CLIENTS.ID_CLIENT
    LEFT JOIN VENTES ON VENTES.ID_CLIENT = CLIENTS.ID_CLIENT
    GROUP BY CLIENTS.NOM
    Question subsidiaire : ma question est-elle une "vraie" question ou s'agit-il ici plutôt d'un problème "cosmétique" comme dirait l'ami SQLPro ?

  2. #2
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Citation Envoyé par enlaan
    ...
    Dans l'exemple précédent, un moyen non élégant
    ...
    Bonjour,
    Je n'ai jamais trouvé d'autres moyens que ce moyen certes non élégant.

    Tu pourrais faire une imbrication de select mais je ne pense pas que ce soit plus élégant.

    a+

  3. #3
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Salut, et bienvenue sur ce forum,

    Pour répondre à la question subsidiaire, j'aurais tendance à dire que la gymnastique pour ramener tes 2 montants en une requête, alors que tu peux les calculer facilement en 2 requêtes distinctes, n'est pas forcément judicieuse. Oui, c'est de la cosmétique

    Si tu n'as pas de soucis de performances, alors laisse comme ça fonctionne, mais je ne suis pas sûr que le COUNT DISTINCT soit performant sur des volumes importants ?
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  4. #4
    Membre éprouvé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Par défaut
    Bonjour,
    je pense la requête suivante doit être plus optimisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select c.noms, a.tot_achats, b.tot_ventes
    from clients c
    left join (select sum(cout_ttc) as tot_achats, id_client 
                 from achats
                 group by id_client) a on a.id_client = c.id_client
    left join (select sum(cout_ttc) as tot_ventes, id_client 
                 from ventes
                 group by id_client) b on b.id_client = c.id_client
    il faut que ta base accepte les sous-requêtes.

  5. #5
    Membre éprouvé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Par défaut
    No answer ! No comment !

  6. #6
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3
    Par défaut
    Bonjour Iper, désolé mais je n'ai pas été notifié de ta première réponse, je m'excuse donc de t'avoir fait attendre.
    Ta solution m'a l'air tout à fait intéressante et elle peut de surcroit structurellement parlant, s'intégrer dans mes développement.
    Je teste ça et je te tiens au courant.
    Merci dans tous les cas pour ta proposition.

Discussions similaires

  1. Requête sur plusieurs Tables Jointes - Mysql 5.5
    Par jérix_kouame dans le forum Requêtes
    Réponses: 1
    Dernier message: 14/05/2012, 09h38
  2. Réponses: 8
    Dernier message: 12/10/2009, 13h31
  3. [MySQL] Select sur plusieurs tables jointes
    Par cariboo45 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 27/09/2008, 15h10
  4. Requête complexe sur plusieurs table
    Par DenPro dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2003, 17h50
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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