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

 MySQL Discussion :

Problème avec l'utilisation de Group by


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Ingénieur
    Inscrit en
    Mars 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2015
    Messages : 35
    Par défaut Problème avec l'utilisation de Group by
    Bonjour à tous,

    Je suis débutante en SQL et je galère depuis quelques temps sur une requête.

    Je possède 3 tables: T01, T02 et T03
    Je souhaite lier ces 3 tables et piocher les paramètres suivants: T02.CSCI, T01.DEDT, T01.CPER, T01.LRAD, T02.NUCH, T03.CPCK, T03.NBVI, T03.NUVI, T03.CNVA, T01.NFCD pour obtenir ce genre de tableau là:
    CSCI DEDT CPER LRAD NUCH CPCK NBVI NUVI CNVA NFCD
    01 11/12/2015 3000 X Y PA1 2 2 A21 8000
    01 12/12/2014 3000 X Y PA1 2 1 A11 8001

    Mon problème, c'est que j'aimerais faire un regroupement sur la colonne T01.CPER en gardant la ligne où T01.DEDT est la plus récente (donc ma première ligne dans mon tableau d'exemple). J'ai du coup essayer avec un Group by en mettant dans mon SELECT: max(T01.DEDT). Mais ça ne fonctionne pas. Il garde quand même les deux lignes.

    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
    16
    17
    18
    19
    20
    21
    SELECT
                 T02.CSCI
    	     ,MAX(T01.DEDT) AS DEDT
    	     ,T01.CPER
    	     ,T01.LRAD
    	     ,T02.NUCH
    	     ,T03.CPCK
    	     ,T03.NBVI
    	     ,T03.NUVI
    	     ,T03.CNVA
           	     ,T01.NFCD
     
       FROM  T01
      INNER JOIN T02 ON(T01.CPER = T02.CPER)
      LEFT OUTER JOIN T03 ON (T01.NFCD=T03.NFCD)          
     
       WHERE     
      T03.NUVI<>T03.NBVI      
     
     
       GROUP BY T01.CPER, T02.CSCI, T01.LRAD, T02.NUCH, T03.CPCK, T03.NBVI, T03.CNVA, T01.NFCD, T03.NUVI
    Si vous pouviez m'aiguiller, ce serait super.
    Merci d'avance pour vos réponses.

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    J'ai eu une problématique très similaire hier. Ma requête n'est pas super propre, cependant celle-ci fonction. Je pense que tu sera capable de faire l'adaptation dans ton cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Select *
        from T01 as Origine
            INNER JOIN T02 ON(T01.CPER = T02.CPER)
            LEFT OUTER JOIN T03 ON (T01.NFCD=T03.NFCD)
        where DEDT = (select max(T01.DEDT) from T01
                    INNER JOIN T02 ON(T01.CPER = T02.CPER)
                    LEFT OUTER JOIN T03 ON (T01.NFCD=T03.NFCD) where *Condition d'unicité lié à T01/T02/T03 origine()*)
    L'idée est de réalisé une sous-requête retournant la valeur maximum en fonction du critère d'unicité de la ligne. Après, il n'y a plus qu'à filtrer sur cette valeur et l'unicité.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre averti
    Femme Profil pro
    Ingénieur
    Inscrit en
    Mars 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2015
    Messages : 35
    Par défaut
    Merci beaucoup Patrick pour ta réactivité et ta réponse.

    Juste quelques précisions...
    Dans ce cas, est-ce que je dois utiliser un Group by (pour qu'il comprenne que l'on doit faire le regroupement sur le CPER) ?
    Et si j'ai des conditions (comme celle que j'avais mis dans mon exemple: where Nbvi<>Nuvi) est-ce que je peux les mettre à la suite du where DEDT= ...?

    Merci.

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Dans ce cas, est-ce que je dois utiliser un Group by (pour qu'il comprenne que l'on doit faire le regroupement sur le CPER) ?
    Logiquement, oui. Ce que je t'ai donnée ne présente que la structure pour gèrer le maximum.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Et si j'ai des conditions (comme celle que j'avais mis dans mon exemple: where Nbvi<>Nuvi) est-ce que je peux les mettre à la suite du where DEDT= ...?
    Oui,le mieux est de mettre les conditions dans la requête principale et la sous-requête.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 917
    Par défaut
    Salut Marye6.

    Si tu désires que l'on résolve correctement ton problème, il nous faut le descriptif de tes tables, ainsi qu'un jeu d'essai et ce que tu désires obtenir au final.
    Sans cela, les réponses seront évasives.

    Citation Envoyé par Marye6
    Mon problème, c'est que j'aimerais faire un regroupement sur la colonne T01.CPER en gardant la ligne où T01.DEDT est la plus récente
    Ce n'est pas un regroupement, mais une sélection dont le critère est la date la plus grande. Si tu mets :
    tu récupères le max de la colonne DEDT et non la ligne contenant ce max.

    La solution est de faire une sous-requête comme ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    where DEDT = (
      select max(T01.DEDT)
      from T01
      where T02.CPER = T01.CPER
    )
    La clause where permet de lier ta sous-requête à la requête principale.

    Citation Envoyé par Marye6
    Dans ce cas, est-ce que je dois utiliser un Group by (pour qu'il comprenne que l'on doit faire le regroupement sur le CPER) ?
    Il n'est pas nécessaire de faire un "group by" sur le CPER car il appartient à la table T01.
    Or en faisant la sous-requête ci-dessus, il va te retourner qu'une seule ligne de T01 (celle ayant max(DEDT)).

    Mais pour être certain de ce que j'avance, il faudrait que tu nous communique un jeu d'essai sur tes trois tables, reflétant exactement ton problème.

    @+

Discussions similaires

  1. Problème avec l'utilisation de LogMessage
    Par vanquish dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 17/11/2005, 10h18
  2. Problème avec l'utilisation d'un module
    Par goblin dans le forum Modules
    Réponses: 4
    Dernier message: 09/11/2005, 20h55
  3. Problème avec l'utilisation de librairies
    Par Aradesh dans le forum MFC
    Réponses: 3
    Dernier message: 01/08/2005, 15h00
  4. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 16h08
  5. Problème avec l'utilisation de la fonction clock
    Par Matgic95 dans le forum C++Builder
    Réponses: 13
    Dernier message: 09/05/2005, 19h27

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