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 :

Ligne max dans requête avec regroupement


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2019
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2019
    Messages : 177
    Points : 45
    Points
    45
    Par défaut Ligne max dans requête avec regroupement
    Bonjour,

    Dans la requête ci-dessous, je cherche à obtenir la ligne max de chaque matricule sur chaque date.
    Je peux avoir 3 niveau dans la colonne crit DGL1 DGL2 DGL3
    J'ai essayé avec avec une requête dans la clause where mais en vain.
    Merci pour votre aide.
    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
    SELECT h.DAT,e.NOM, h.MOTIF, e.MIN(CRI.DATDEB),  c.DATFIN,c.CRIT) as crit,
    CASE WHEN c.CRIT = 'DGL3'  then 1 else 0 end as DGL2,
    CASE WHEN  c.CRIT = 'DGL2' then 1 else 0  end   as DGL2,
    CASE WHEN c.CRIT = 'DGL1' then 1 else 0  end  asDGL1
    FROM e, h, c
    WHERE e.MATRI = h.MATRI
    AND c.MATRI = e.MATRI
    AND h.MATRI = c.MATRI
    AND c.CRIT in ('DGL2', 'DGL1','DGL3') 
     
    AND SUBSTR(h.MOTIF,7,2) in('JP')
    AND h.DAT > = c.DATDEB AND h.DAT <= c.DATFIN
     
    AND EXTRACT(YEAR FROM h.DAT) = '2015'
    GROUP BY h.DAT,e.NOM, h.MOTIF,c.DATFIN, c.CODECRIT
     
    ORDER BY h.DAT

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Qu'est-ce que tu appelles la "ligne max" précisément ?
    Est-ce que tu peux nous donnée un jeu de test, et le résultat attendu ?

    Tatayo.

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 219
    Points
    8 219
    Billets dans le blog
    17
    Par défaut
    je cherche à obtenir la ligne max de chaque matricule sur chaque date.
    Si tu souhaites obtenir une ligne par matricule selon la date la plus récente alors tu peux lire ceci => https://www.developpez.net/forums/bl...es-5-methodes/
    Sinon il nous faudrait un échantillon de tes tables et le résultat attendu pour celui-ci.


    PS : Pour les jointures il est toujours plus clair de passer par INNER JOIN

    FROM e, h, c
    WHERE e.MATRI = h.MATRI
    AND c.MATRI = e.MATRI
    AND h.MATRI = c.MATRI
    Donne :

    FROM e
    INNER JOIN h ON e.MATRI = h.MATRI
    INNER JOIN c ON h.MATRI = c.MATRI
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  4. #4
    Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2019
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2019
    Messages : 177
    Points : 45
    Points
    45
    Par défaut
    Merci pour vos premiers retours.
    Dans les données ci-dessous, dans l'exemple de la date du 01/01/2018 je souhaite obtenir pour chaque nom, le Crit maxi.
    Par exemple pour le nom E, je souhaiterais obtenir que la ligne DGL3, pour le NOM C quela ligne DGL2

    DAT NOM MOTIF c.datdeb c.datefin c.CRIT DGL3 DGL2 DGL1
    01/01/18 A JP 28/05/15 29/09/21 DGL1 0 0 1
    01/01/18 B JP 06/05/15 26/10/21 DGL1 0 0 1
    01/01/18 C JP 28/05/15 21/11/19 DGL1 0 0 1
    01/01/18 C JP 28/05/15 21/11/19 DGL2 0 1 0
    01/01/18 D JP 15/04/15 04/10/21 DGL1 0 0 1
    01/01/18 D JP 22/12/17 05/01/22 DGL2 0 1 0
    01/01/18 D JP 06/01/17 21/07/22 DGL3 1 0 0
    01/01/18 E JP 28/05/15 29/04/20 DGL1 0 0 1
    01/01/18 E JP 28/05/15 29/04/20 DGL2 0 1 0
    01/01/18 E JP 30/06/15 29/04/20 DGL3 1 0 0
    01/01/18 F JP 28/05/15 04/10/21 DGL1 0 0 1
    01/01/18 F JP 22/12/17 01/07/23 DGL2 0 1 0
    01/01/18 G JP 28/05/15 29/11/20 DGL1 0 1 0
    01/01/18 G JP 28/05/15 04/10/21 DGL2 0 0 1
    01/01/18 H JP 28/05/15 12/04/23 DGL1 0 0 1

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 219
    Points
    8 219
    Billets dans le blog
    17
    Par défaut
    OK, ça me paraît plus clair. Et quelle est la clef primaire de tes lignes ? Quelles sont les contraintes d'unicité ?

    DAT		NOM	MOTIF	c.datdeb	c.datefin	c.CRIT	DGL3	DGL2	DGL1
    01/01/18	A 	JP 	28/05/15 	29/09/21 	DGL1 	0 	0 	1
    01/01/18 	B 	JP 	06/05/15 	26/10/21 	DGL1 	0 	0 	1
    01/01/18 	C 	JP 	28/05/15 	21/11/19 	DGL1 	0 	0 	1
    01/01/18 	C 	JP 	28/05/15 	21/11/19 	DGL2 	0 	1 	0
    01/01/18 	D 	JP 	15/04/15 	04/10/21 	DGL1 	0 	0 	1
    01/01/18 	D 	JP 	22/12/17 	05/01/22 	DGL2 	0 	1 	0
    01/01/18 	D 	JP 	06/01/17 	21/07/22 	DGL3 	1 	0 	0
    01/01/18 	E 	JP 	28/05/15 	29/04/20 	DGL1 	0 	0 	1
    01/01/18 	E 	JP 	28/05/15 	29/04/20 	DGL2 	0 	1 	0
    01/01/18 	E 	JP 	30/06/15 	29/04/20 	DGL3 	1 	0 	0
    01/01/18 	F 	JP 	28/05/15 	04/10/21 	DGL1 	0 	0 	1
    01/01/18 	F 	JP 	22/12/17 	01/07/23 	DGL2 	0 	1 	0
    01/01/18 	G 	JP 	28/05/15 	29/11/20 	DGL1 	0 	1 	0
    01/01/18 	G 	JP 	28/05/15 	04/10/21 	DGL2 	0 	0 	1
    01/01/18 	H 	JP 	28/05/15 	12/04/23 	DGL1 	0 	0 	1
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2019
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2019
    Messages : 177
    Points : 45
    Points
    45
    Par défaut
    J'utilise trois tables h, e et c avec un lien sur le matricule entre chaque table.
    h contient dat et motif,
    e contient nom
    c contient datdeb, datfin et crit.

    Je ne suis pas sur de comprendre votre question sur l'unicité.

    Merci à vous.

  7. #7
    Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2019
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2019
    Messages : 177
    Points : 45
    Points
    45
    Par défaut
    Je ne trouve pas comment malgré des recherches.

  8. #8
    Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2019
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2019
    Messages : 177
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    Est-il possible d'utiliser MAX sur la colonne c.crit pour obtenir le résultat ?

    Merci pour vos réponses.

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


    Voici un exemple de solution avec la fonction max()

    Code SQL : 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
    22
    23
    24
    25
    26
    27
    28
    with T1(nom, datedeb, datefin, crit) as
        (SELECT  'A', '28-05-2015', '29-09-2021', 'DGL1'   union all
         SELECT  'B', '06-05-2015', '26-10-2021', 'DGL1'   union all
         SELECT  'C', '28-05-2015', '21-11-2019', 'DGL1'   union all
         SELECT  'C', '28-05-2015', '21-11-2019', 'DGL2'   union all
         SELECT  'D', '15-04-2015', '04-10-2021', 'DGL1'   union all
         SELECT  'D', '22-12-2017', '05-01-2022', 'DGL2'   union all
         SELECT  'D', '06-01-2017', '21-07-2022', 'DGL3'   union all
         SELECT  'E', '28-05-2015', '29-04-2020', 'DGL1'   union all
         SELECT  'E', '28-05-2015', '29-04-2020', 'DGL2'   union all
         SELECT  'E', '30-06-2015', '29-04-2020', 'DGL3'   union all
         SELECT  'F', '28-05-2015', '04-10-2021', 'DGL1'   union all
         SELECT  'F', '22-12-2017', '01-07-2023', 'DGL2'   union all
         SELECT  'G', '28-05-2015', '29-11-2020', 'DGL1'   union all
         SELECT  'G', '28-05-2015', '04-10-2021', 'DGL2'   union all
         SELECT  'H', '28-05-2015', '12-04-2023', 'DGL1'
        )
    select nom
         , datedeb
         , datefin
         , crit
    from T1 main
    where crit =
         (select max(crit)
          from T1 subq
          where subq.nom = main.nom
         )
    order by nom


    Une autre solution avec un test d'existence :

    Code SQL : 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
    22
    23
    24
    25
    26
    27
    28
    29
    with T1(nom, datedeb, datefin, crit) as
        (SELECT  'A', '28-05-2015', '29-09-2021', 'DGL1'   union all
         SELECT  'B', '06-05-2015', '26-10-2021', 'DGL1'   union all
         SELECT  'C', '28-05-2015', '21-11-2019', 'DGL1'   union all
         SELECT  'C', '28-05-2015', '21-11-2019', 'DGL2'   union all
         SELECT  'D', '15-04-2015', '04-10-2021', 'DGL1'   union all
         SELECT  'D', '22-12-2017', '05-01-2022', 'DGL2'   union all
         SELECT  'D', '06-01-2017', '21-07-2022', 'DGL3'   union all
         SELECT  'E', '28-05-2015', '29-04-2020', 'DGL1'   union all
         SELECT  'E', '28-05-2015', '29-04-2020', 'DGL2'   union all
         SELECT  'E', '30-06-2015', '29-04-2020', 'DGL3'   union all
         SELECT  'F', '28-05-2015', '04-10-2021', 'DGL1'   union all
         SELECT  'F', '22-12-2017', '01-07-2023', 'DGL2'   union all
         SELECT  'G', '28-05-2015', '29-11-2020', 'DGL1'   union all
         SELECT  'G', '28-05-2015', '04-10-2021', 'DGL2'   union all
         SELECT  'H', '28-05-2015', '12-04-2023', 'DGL1'
        )
    select nom
         , datedeb
         , datefin
         , crit
    from T1 main
    where not exists
         (select 1
          from T1 subq
          where subq.nom = main.nom
            and subq.crit>main.crit
         )
    order by nom


    D'autres solutions sont possibles, elles sont récapitulées dans mon blog ICI

  10. #10
    Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2019
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2019
    Messages : 177
    Points : 45
    Points
    45
    Par défaut
    Merci beaucoup cela réponds complétement à ce que je cherchais.

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

Discussions similaires

  1. [AC-2007] expression compte dans une requête avec regroupement et critère
    Par bernard26 dans le forum Access
    Réponses: 2
    Dernier message: 11/08/2018, 00h27
  2. Afficher ligne à 0 dans requête analytique
    Par jerjerrod dans le forum SQL
    Réponses: 4
    Dernier message: 29/05/2008, 22h12
  3. Problème dans requête avec clause MAX
    Par tonio-lille dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/10/2007, 17h00
  4. Problème dans requête avec la fonction Right
    Par Mariboo dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 17/08/2006, 10h27
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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