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 :

Deux clauses Group by dans une seule requête


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Deux clauses Group by dans une seule requête
    Bonjour à tous,

    Je me demande si c'est possible d'utiliser 2 fois Group by sur une meme requete ?

    En effet j'ai la table suivante :

    Vendeur Produit Quantité
    1 A 12
    2 G 8
    1 C 5
    1 A 3
    2 G 14

    Je voudrais avoir le total des ventes pour chanque vendeur et chaque produit comme suit :

    Vendeur Produit Quantite
    1 A 15 (12+3)
    1 C 5
    2 G 22 (8+14)

    J'ai pensé à cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select Vendeur, Produit, SUM(Quantite)
    from table
    Group by Vendeur
    Ce qui je pense répond uniquement à "Chaque vendeur" mais pas à "Chaque produit)
    Raison pour la quelle je me demande si c'est possible d'utiliser 2 fois Group By

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 184
    Points : 12 733
    Points
    12 733
    Par défaut
    Bonjour,
    On ne peut pas mettre 2 GROUP BY dans la même requête, mais on peut mettre plusieurs colonnes dans un GROUP BY.
    D'ailleurs toutes les colonnes qui ne font pas l'objet d'une agrégation (sum,avg...) DOIVENT être dans la clause GROUP BY.

    Tatayo.

  3. #3
    Candidat au Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci,

    Donc je pourrais faire ceci ?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select Vendeur, Produit, SUM(Quantite)
    from table
    Group by Vendeur, Produit
    En ajoutant Produit dans Group by cela répondrai à ma question ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 184
    Points : 12 733
    Points
    12 733
    Par défaut
    Tout à fait. Mais il suffit de faire le test pour s'en convaincre
    Il y a des tutoriels SQL ici, par exemple celui-ci qui traite justement des regroupements.

    Bonne lecture !

    Tatayo.

  5. #5
    Candidat au Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    J'aurais bien aimé pouvoir tester mais je travaille sur papier pour l'intant.

    Merci pour la réponse.

    Je veux compliquer un peu les choses pour apprendre mieux car je suis entrain d'apprendre le SQL

    Vendeur et produit sont des id dans une table qui s'appelle Vente, ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select VendeurID, ProduitID, SUM(Quantite)
    from Vente
    Group by VendeurID, ProduitID
    Les vendeurs et produits sont dans des tables respectives avec nom et id comme suit

    Vendeur
    IdVen NomVen

    Produit
    IdProd NomProd

    Je voudrais récuperer les noms des produits et vendeurs au lieu des id donc je dois aller les chercher dans leurs tables respectives, est ce que cette requete a un sens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select VendeurID, NomVen, ProduitID, NomProd, SUM(Quantite)
    from Vendeur, Produit
    Group by VendeurID, ProduitID
    Inner join Vente ON Vendeur.IdVen=Vente.VendeurID, Produit.IdProd=Vente.ProduitID

  6. #6
    Candidat au Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Je pense que Group by doit etre la fin comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select VendeurID, NomVen, ProduitID, NomProd, SUM(Quantite)
    from Vendeur, Produit
    Inner join Vente ON Vendeur.IdVen=Vente.VendeurID, Produit.IdProd=Vente.ProduitID
    Group by VendeurID, ProduitID

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 762
    Points
    30 762
    Par défaut
    ça aura plus de chances de fonctionner comme cela :
    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
    Select  vnd.VendeurID
        ,   vnd.NomVen
        ,   prd.ProduitID
        ,   prd.NomProd
        ,   SUM(vnt.Quantite)
    from    Vente   vnt
        Inner join 
            Vendeur vnd
            ON  vnd.IdVen   = vnd.VendeurID
        Inner join 
            Produit prd
            ON  prd.IdProd  = vnt.ProduitID
    Group by vnd.VendeurID
        ,   prd.ProduitID
    ;
    Par ailleurs les colonnes ProduitID et IdProd représentent la même information (tout comme VendeurId et IdVen) ; elles devraient porter le même nom
    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.

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 144
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Même si c'est pas l'objet ici, cela fait plusieurs topics que je lis où différentes personnes (dont notamment des experts tels que SQLPro, al1_24, tatayo ou encore aieuuuu - désolé pour l'orthographe de ce dernier -) disent :

    "On ne peut pas faire deux GROUP BY dans une même requête"
    "On ne peut pas imbriquer des fonctions de regroupement dans une requête".

    Et ce, à grands coups de citations de la norme SQL.

    Certes, dans une requête "simple", on ne peut pas.

    Mais si par exemple, je souhaite, pour chaque vendeur, connaître la quantité moyenne de produits vendus, alors :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Select Vendeur, AVG(Quantite)
    from table
    Group by Vendeur
    => C'est faux. Car pour le cas du vendeur 2, qui a vendu une fois 8 unités du produit G et une fois 14 unités du produit G, on va avoir une moyenne de 11, alors que ce que je cherche, c'est la moyenne sur le total des ventes de chaque produit, donc ici, 22.

    Le souci, c'est que :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Select Vendeur, produit, sum(Quantite)
    from table
    Group by Vendeur, produit

    Me retourne bien 22 pour le vendeur 2, qui n'a vendu que le produit G, mais pour le vendeur A, j'ai deux lignes, 15 pour le produit A et 5 pour le produit C... Moi je veux la moyenne, donc 10.

    Et donc, je vais, dans une seule requête SQL, avoir deux group by, et imbriquer deux fonctions de regroupement...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select vendeur, avg(total) moyenne
    from (
       Select Vendeur, sum(Quantite) total
       from table
       Group by Vendeur, produit
    ) subquery
    group by vendeur

    Et c'est parfaitement valide.

    Voilà, juste histoire de dédramatiser le sujet, et éviter de faire croire que le SQL est autant limité que ça.
    On ne jouit bien que de ce qu’on partage.

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 059
    Points : 38 268
    Points
    38 268
    Billets dans le blog
    9
    Par défaut
    Ca ne change rien, on a bien un group by par requête : un dans la requête principale, et un dans la sous-requete

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 184
    Points : 12 733
    Points
    12 733
    Par défaut
    Stringbuiler => j'ai volontairement simplifié ici pour ne pas embrouiller notre amis.
    Mais pour mieux coller à la réalité j'aurai dû dire: pas plus d'une clause GROUP BY par SELECT.
    Et je l'ai également aiguillé vers les tutoriels qui sont bien plus détaillés et "didactiques" que je ne le suis

    Tatayo.

  11. #11
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 144
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Ca ne change rien, on a bien un group by par requête : un dans la requête principale, et un dans la sous-requete
    Il y a une seule requête hein... "sous-requête" est un abus de langage.

    Et j'aime pas les réponses incomplètes du genre "ben non on peut pas", en oubliant juste que "ben en fait, si, mais en écrivant autrement".
    On ne jouit bien que de ce qu’on partage.

  12. #12
    Candidat au Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup pour vos réponses très utiles, je débute en SQL et j'espère être à votre niveau un jour.

    J'ai hate de pouvoir essayer sur une base de données parce que pour l'instant je ne peux que écrire sur papier (J'attends un accès à une base de données).

    J'ai une qutre question :

    J'ai ces tables :

    Clients
    CliID CliNom

    Produit
    ProdID ProdNom PrixUnitaire

    Vente
    CliID ProdID Quantité


    Je voudrais savoir tous les produits commandés par la compagnie MaComp avec le nombre d'unités et la somme de tous ses achats.

    Je suppose que je dois faire une multiplication du prix unitaire et du nombre de produit commandé pour chaque commande

    J'ai essayé comme ca mais je ne suis pas sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select SUM (VT.Quantite), PR.PrixUnitaire*VT.Quantite
    From Vente VT, Produit PR, Client CL
    Where CL.CliNom = "MaComp"
    Order by PR.ProdID
    Est ce que c'est bon ?

    Merci

  13. #13
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    C'est un très beau produit cartésien que vous nous avez pondu là

    Prennez l'habitude d'écrire vos jointures avec l'opérateur JOIN pour plus de lisibilité.
    Ainsi, quand vous introduisez 3 tables, ne mettez pas de virgules, juste des opérateurs JOIN, ca vous donnera déjà une bonne base de départ.


    Ensuite, si vous introduisez un opérateur d'aggrégation, ici, en l'occurence, l'opérateur SUM... il faut soit qu'il soit groupé par un colonne de dimension - mais ici, ce n'est pas le cas dans ce que vous avez écrit - soit que les autres colonnes soit elles aussi inclusent dans l'opérateur.

    En l'occurence, si vous avez un SUM (VT.Quantite) d'un coté, vous ne pouvez pas avoir PR.PrixUnitaire*VT.Quantite seul de l'autre...
    cette partie doit aussi faire l'objet d'une somme
    sum(PR.PrixUnitaire*VT.Quantite)

    Enfin, d'après votre descriptif, il va manquer la description du produit (au moins son nom) et donc un group by pour afficher votre résultat produit par produit.
    car là, vous n'avez qu'une grosse somme informe.

  14. #14
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 792
    Points : 34 013
    Points
    34 013
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par StringBuilder
    Il y a une seule requête hein... "sous-requête" est un abus de langage.
    En quoi est-ce "un abus de langage" ?

    Il y a bien une requête dans une requête et le SGBD va bien tenir compte des deux parties. Dans beaucoup de cas, il va même exécuter d'abord la sous-requête puis utiliser son résultat pour exécuter la requête principale.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  15. #15
    Candidat au Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    C'est un peu compliqué pour moi. Y-aurai t'il une solution plus simple ? Je n'arrive pas à voir comment utiliser les jointures et 2 fonctions en même temps à savoir la somme et la multiplication

  16. #16
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Dans ce cas, il faut relire encore une fois les cours et tutoriels de formation pour appendre SQL :
    http://sqlpro.developpez.com/cours/sqlaz/jointures/
    http://sqlpro.developpez.com/cours/sqlaz/ensembles/
    http://sql.developpez.com/

    ...

    Y'a difficilement plus basique que ce que vous essayez de faire... même les exos scolaires demande de truc tordus et là, c'est pas du tout votre cas. donc faudrait vous y mettre un minimum quand même.


    Commencez par faire vos jointures correctement. et après, on ajoutera les clauses sum et group by.
    Juste affichez produit, quantité, prix, et ca sera déjà pas mal.

  17. #17
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Citation Envoyé par StringBuilder Voir le message
    Voilà, juste histoire de dédramatiser le sujet, et éviter de faire croire que le SQL est autant limité que ça.
    Personne ne fait croire cela.
    C'est au contraire illimité, puisque tout est possible.
    il y a souvent plusieurs solutions possibles.

    Par exemple, pour obtenir vos moyennes par vendeur, pas besoin de requete imbriquée, celle ci suffit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT 
    		vendeur, SUM(Quantite)/COUNT(DISTINCT produit)
    FROM	LaTable
    GROUP BY vendeur

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/10/2011, 12h07
  2. Deux requêtes dans une seule requête, est-ce possible ?
    Par Stephane_br dans le forum Développement
    Réponses: 3
    Dernier message: 08/07/2011, 16h35
  3. Réponses: 2
    Dernier message: 01/10/2010, 15h00
  4. Deux COUNT dans une seule requête
    Par aya02 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/07/2010, 11h17
  5. [Oracle] Deux COUNT dans une seule requête
    Par EvilJajuka dans le forum Débuter
    Réponses: 5
    Dernier message: 30/09/2009, 12h00

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