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 :

GROUP BY et MIN


Sujet :

Langage SQL

  1. #1
    Membre confirmé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Points : 603
    Points
    603
    Par défaut GROUP BY et MIN
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T1.MIN(PRIX), T2.designation,T3.ID,
               FROM T3 INNER JOIN T1 ON T3.ID = T1.ID
               INNER JOIN T2 ON T1.ID = T2.ID
               GROUP BY T2.designation, T3.ID
    C'est difficile a demandé, mais je veux avoir un prix minimum mais également avoir la désignation d'une unité de prix. Or il se peut que j'ai pour un même ID plusieurs couple (prix mini/unité), mais je veux seulement le véritable mini et en meme temps l'unité qui lui ai lié ^^

    Je sais pas si c'est compréhensible ^^

    mais la par exemple j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    112 - 15.0€ - Kg
    112 - 18.5€ - L
    Or je veux que la première ligne dans ce cas précis...
    Windev 23 - SQL SERVER - PHP
    Play : TFT - Jeux indé

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Ce serait assez simple (via une CTE par exemple) si l'unité de mesure et la quantité étaient dans la même table ce qui semblerait logique, or ce n'est a priori pas le cas
    Avec la désignation dans T2 et la quantité dans T1, il ne vous reste que l'ID pour rapprocher les 2 tables, c'est donc impossible de prendre à coup sur la bonne unité de mesure
    Par contre vous n'avez nullement besoin de la table T3, puisque vous n'y prenez que l'ID que l'on retrouve déjà dans T1 et T2

    Voici une solution possible sous condition que le prix et l'unité de mesure correspondante soient dans la même table (ce qui me semble incontournable d'un point de vue modélisation) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH CTE1 AS                        
          (SELECT IDENT     AS ID
                , MIN(PRIX) AS MT       
           FROM TAB1
           GROUP BY IDENT)             
    SELECT CTE1.ID                      
         , CTE1.MT                      
         , TAB1.UNITE                  
    FROM CTE1                           
    INNER JOIN TAB1 AS TAB1
       ON TAB1.IDENT=CTE1.ID           
      AND TAB1.PRIX =CTE1.MT           
     ;

  3. #3
    Membre confirmé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Bonjour,

    Ce serait assez simple (via une CTE par exemple) si l'unité de mesure et la quantité étaient dans la même table ce qui semblerait logique, or ce n'est a priori pas le cas
    Avec la désignation dans T2 et la quantité dans T1, il ne vous reste que l'ID pour rapprocher les 2 tables, c'est donc impossible de prendre à coup sur la bonne unité de mesure
    Par contre vous n'avez nullement besoin de la table T3, puisque vous n'y prenez que l'ID que l'on retrouve déjà dans T1 et T2
    Merci pour ta réponse, mais je vais être un peu plus précis

    En gros, j'ai l'ID d'un ITEM dans la table T3,
    Le prix dans la table T2, et la désignation de l'unité du prix dans la table T1

    Dans la T2, j'ai le prix et l'id de l'unité de quantité.
    Et donc au final je veux pour chaque ID de la table T3, le prix minimum possible trouvable dans la table T2, et pour cette valeur de la table T2, retrouver la désignation de l'unité de quantité dans la table T1 ^^
    Windev 23 - SQL SERVER - PHP
    Play : TFT - Jeux indé

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    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 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Ce problème rejoint la "recherche du dernier", qui revient souvent sur le site.
    Si on considère que le prix le plus bas est celui pour lequel il n'en existe pas de plus bas (Lapalisse, si tu nous lis...), il suffit de ne pas utiliser de fonction d'agrégation et passer par une jointure externe, ou un NOT EXISTS.

    Tatayo.

    P.S. il faut écrire min(t1.prix), et non t1.min(prix)...

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Nhaps Voir le message
    Merci pour ta réponse, mais je vais être un peu plus précis

    En gros, j'ai l'ID d'un ITEM dans la table T3,
    Le prix dans la table T2, et la désignation de l'unité du prix dans la table T1

    Dans la T2, j'ai le prix et l'id de l'unité de quantité.
    Et donc au final je veux pour chaque ID de la table T3, le prix minimum possible trouvable dans la table T2, et pour cette valeur de la table T2, retrouver la désignation de l'unité de quantité dans la table T1 ^^
    D'accord, en ce cas reprenez simplement l'exemple que j'ai mis plus haut en ajoutant une jointure vers T1 pour rechercher la désignation correspondant au code unité de mesure

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Ce qui devrait donner quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH CTE1 AS                        
          (SELECT IDENT     AS ID
                , MIN(PRIX) AS MT       
           FROM TAB2
           GROUP BY IDENT)             
    SELECT CTE1.ID                      
         , CTE1.MT                      
         , TAB3.LIBELLE                  
    FROM CTE1                           
    INNER JOIN TAB2 AS T2
       ON T2.IDENT=CTE1.ID           
      AND T2.PRIX =CTE1.MT      
    INNER JOIN TAB3 AS T3
       ON T3.CODEUNITE = T2.CODEUNITE

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Ou également (comme le suggère Tatayo),

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT T2.ID                      
         , T2.PRIX                     
         , T3.LIBELLE                  
    FROM  TAB2 AS T2                          
    INNER JOIN TAB3 AS T3
       ON T3.CODEUNITE = T2.CODEUNITE
    WHERE NOT EXISTS
         (SELECT 1
          FROM TAB2 AS SUBQ
          WHERE SUBQ.ID   = T2.ID
            AND SUBQ.PRIX < T2.PRIX)
    Cette deuxième solution sera le plus souvent plus rapide que la précédente

  8. #8
    Membre confirmé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Points : 603
    Points
    603
    Par défaut
    Merci beaucoup, j'ai appris pas mal de choses grâce à vous
    Windev 23 - SQL SERVER - PHP
    Play : TFT - Jeux indé

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

Discussions similaires

  1. GROUP BY HAVING MIN(DATEDIFF())
    Par metalsephiroth dans le forum Linq
    Réponses: 2
    Dernier message: 21/05/2011, 10h07
  2. problème de requête avec utilisation de min/group by
    Par htristra dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 02/10/2007, 13h16
  3. Récupérer un min d'un champ, sans group by
    Par amalane dans le forum Requêtes
    Réponses: 0
    Dernier message: 22/07/2007, 19h17
  4. [SQL] Group by + SUM + Min
    Par Deejoh dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2006, 15h46
  5. Group By tout les 10 min
    Par clancy182 dans le forum Requêtes
    Réponses: 10
    Dernier message: 29/01/2006, 23h30

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