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 MySQL Discussion :

COUNT et SUM dans une jointure


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 81
    Par défaut COUNT et SUM dans une jointure
    Bonjour,

    J'ai la solution à mon problème mais je me demande si c'est la bonne !
    Je fais une jointure sur une table dont je souhaite additionner un total de ventes et un total d'offres souscrites.

    Ma première intuition était de procéder ainsi car la table ventes contient plusieurs entrées et je ne souhaitais n'en ramener qu'une cumulée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT P.id, P.Commune_ref, P.Statut, montant_total_n1, nb_offres_n1
    	FROM partenaires P
    	LEFT JOIN (
    		SELECT `idpartenaire`, SUM(montant) AS montant_total_n1, COUNT(offre) AS nb_offres_n1
    		FROM `ventes`
    	) AS table_montant_total_n1
    	ON P.id = table_montant_total_n1.idpartenaire
    	WHERE `id` = 'identifiant'
    Je m'aperçois que le montant_total_n1 et nb_offres_n1 me ramènent "NULL"... comme un message caché pour me décrire !
    Par contre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT P.id, P.Commune_ref, P.Statut, SUM(montant) AS montant_total_n1, COUNT(offre) AS nb_offres_n1
    	FROM partenaires P
    	LEFT JOIN (
    		SELECT `idpartenaire`, montant, offre
    		FROM `ventes`
    	) AS table_montant_total_n1
    	ON P.id = table_montant_total_n1.idpartenaire
    	WHERE `id` = 'identifiant'
    Me ramènent effectivement les valeurs correctes cumulées.
    Est-ce bien comme cela qu'il faut procéder ?

    Merci d'avance pour vos conseils.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 138
    Par défaut
    Dans les deux requêtes, il manque la clause GROUP BY.
    Il n'y a que MySQL pour autoriser l'usage de fonction d'agrégation sans regroupement sur les colonnes non agrégées.
    Les valeurs retournées sont aléatoires et les résultats faux, ce qui est le cas ici.

    Dans la première requête, telle qu'elle est présentée, la sous-requête retourne une seule ligne avec une valeur de idpartenaire prise au hasard dans la table. Ceci explique le résultat obtenu.

    Dans la seconde requête, il est inutile de passer par une sous-requête pour accéder aux données de la table ventes.

    Dans les deux cas, il faut ajouter des critères de regroupement.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 81
    Par défaut
    Ok le fameux GROUP BY...
    Je saurai à l'avenir qu'il faut systématiquement en spécifier lors de jointures !

    Merci al1_24 ^^

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 138
    Par défaut
    GROUP BY n'a rien à voir avec les jointures, uniquement avec les agrégations.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 81
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    GROUP BY n'a rien à voir avec les jointures, uniquement avec les agrégations.
    Bien noté !
    Merci encore !

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

Discussions similaires

  1. sum() dans une jointure interne
    Par xenos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/07/2007, 18h42
  2. utiliser le resultat d'un SUM dans une variable
    Par Qapoka dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 16/05/2006, 16h47
  3. COUNT dans une jointure
    Par picsoun dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/04/2006, 21h27
  4. Ordre d'exécution dans une jointure externe
    Par Pero dans le forum Langage SQL
    Réponses: 17
    Dernier message: 20/09/2005, 13h22
  5. [VBA-E] Fonction sum() dans une cellule
    Par Gonzo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/12/2002, 11h18

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