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 et SQL. Discussion :

Sélection du premier enregistrement de chaque groupe


Sujet :

Requêtes et SQL.

  1. #1
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut Sélection du premier enregistrement de chaque groupe
    Bonjour,

    Dans une application existante que je reprends, je dois filtrer une liste de documents en ne sélectionnant que la dernière révision. Malheureusement, la structure de la base est loin d'être parfaite et il me faut effectuer un tri portant sur plusieurs champs pour classer les révisions et ainsi déterminer la dernière.

    Voici un exemple de la liste des documents triée comme souhaité
    NUMERO----INDICE----STATUT
    AAAAA----B----OBS
    AAAAA----B----INF
    AAAAA----A----VIS
    BBBBB----B----VIS
    BBBBB----A----VIS
    CCCCC----A----OBS
    CCCCC----A----INF
    DDDDD----A----INF


    Mon besoin est de sélectionner dans cette liste, la première ligne pour chaque numéro. Dans mon exemple, cela donne:
    NUMERO----INDICE----STATUT
    AAAAA----B----OBS
    BBBBB----B----VIS
    CCCCC----A----OBS
    DDDDD----A----INF


    J'ai essayé avec une sous requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT asD.Numero, asDernier.INDICE, asDernier.STATUT
    FROM tblDocuments AS asD, 
            [SELECT  TOP 1 asM.NUMERO, asM.INDICE, asM.STATUT  
            FROM (tblModif as asM  INNER JOIN tblIndice as asI ON asM.INDICE = asI.Ind) 
                     INNER JOIN tblStatut as asS ON asM.STATUT = asS.Statut  
            WHERE asD.Numero= asM.NUMERO  
            ORDER BY asM.NUMERO DESC , asI.Rang DESC , asM.INDICE DESC , asS.Rang DESC , asM.STATUT DESC]. AS asDernier;
    Mais le moteur ne sait pas l'interpréter: il me demande comme paramètre le asD.Numero.

    J'ai essayé en plaçant la liste dans une requête:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT asD.Numero, asDernier.INDICE, asDernier.STATUT
    FROM tblDocuments AS asD, 
            [SELECT  TOP 1 asV.NUMERO, asV.INDICE, asV.STATUT  
             FROM qryVersions as asV WHERE asD.Numero= asV.NUMERO]. AS asDernier;
    J'ai le même problème.


    J'ai essayé en décomposant le problème en plusieurs requêtes... je tourne rond.

    peut être en numérotant les lignes pour chaque numéro de document...


    Quelqu'un a une idée?
    ............................................................................................

    Dans l'intérêt de tous, ne posez pas de questions techniques par messages privés.

  2. #2
    Membre averti
    Avatar de The_Super_Steph
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 445
    Points : 359
    Points
    359
    Par défaut
    Bonjour,


    peut être en numérotant les lignes pour chaque numéro de document...
    Sais-tu comment on procède pour faire cela ?

    cordialement,

    Stéphanie
    Blonde, d'origine belge et gauchère... et alors !
    "N'est stupide que la stupidité"

    Quand il n'y a pas de solution, c'est qu'il n'y a pas de problème

    (\ _ /)
    (='.'=)
    Voici Lapinou, le lapin crétin-Rasta. Aidez le à conquérir le monde
    (")-(") en le reproduisant !

  3. #3
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Bon j'ai trouvé une solution.

    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
    SELECT asR.NUMERO, asR.INDICE, asR.STATUT
    FROM qryRévisions AS asR
    WHERE ((((SELECT COUNT(*) FROM qryRévisions as asQ_SR 
        WHERE asQ_SR.NUMERO = asR.NUMERO 
        AND
        (asQ_SR.IRang>asR.IRang 
            OR (asQ_SR.IRang=asR.IRang 
                    AND (asQ_SR.Indice>asR.Indice 
                                OR (asQ_SR.Indice=asR.Indice 
                                            AND (asQ_SR.SRang>asR.SRang 
                                                        OR (asQ_SR.SRang=asR.SRang 
                                                                    AND (asQ_SR.Statut>asR.Statut)
                                                            )
                                                )
                                    )
                        )
                )
        )
    ))=0))
    ORDER BY asR.NUMERO;

    Un peu lourd mais ... ça marche!

    Citation Envoyé par The_Super_Steph
    peut être en numérotant les lignes pour chaque numéro de document...

    Sais-tu comment on procède pour faire cela ?
    Pour numéroter les lignes, il faut compter dans une sous requête le nombre de lignes se trouvant avant la ligne en cours.




    C'est dans le même esprit qu'est contruite la requête ci-dessus, mais j'ai compté le nombre de ligne qui sont aprés la ligne en cours pour un méme [Numero] et je ne garde que ceux pour lesquels le décompte est à 0, soit la dernière ligne de chaque lot.

    Dans mon cas cela se complique un peu car la clé de tri porte sur 4 champs.
    ............................................................................................

    Dans l'intérêt de tous, ne posez pas de questions techniques par messages privés.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT numero, First(indice) AS PremierDeindice, First(statut) AS PremierDestatut
    FROM matable
    GROUP BY numero;
    pourrait suffire mais je crains des difficultés à terme
    Elle est pas belle la vie ?

  5. #5
    Membre averti
    Avatar de The_Super_Steph
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 445
    Points : 359
    Points
    359
    Par défaut
    Merci mout1234,

    Mais je ne comprends pas le contenu de ta requête... Je ne suis pas encore assez calée...
    Blonde, d'origine belge et gauchère... et alors !
    "N'est stupide que la stupidité"

    Quand il n'y a pas de solution, c'est qu'il n'y a pas de problème

    (\ _ /)
    (='.'=)
    Voici Lapinou, le lapin crétin-Rasta. Aidez le à conquérir le monde
    (")-(") en le reproduisant !

  6. #6
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Bonjour random,

    Citation Envoyé par random
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT numero, First(indice) AS PremierDeindice, First(statut) AS PremierDestatut
    FROM matable
    GROUP BY numero;
    pourrait suffire mais je crains des difficultés à terme

    Merci mais j'avais commencé par là... cela ne me donnait pas le bon résultat. J'avoue n'avoir toujours cerné les règles exactes de fonctionnement de la clause First.
    Si quelqu'un maitrise ce sujet , quelques explications seraient les bienvenues .
    J'ai l'impression qu'elle n'est utilisable en pareil situation que si la clé de tri ne porte que sur un champ...
    Petit détail qui peut jouer... les tables de la base que je m'évertue à toiletter... n'ont évidement pas de clé primaire ni même d'index.... c'eut été trop beau
    ............................................................................................

    Dans l'intérêt de tous, ne posez pas de questions techniques par messages privés.

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

Discussions similaires

  1. SQL premier enregistrement dans un group by
    Par scoli dans le forum MS SQL Server
    Réponses: 15
    Dernier message: 06/04/2013, 01h33
  2. Sélection des derniers enregistrements de chaque jour
    Par sebastyen dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/05/2009, 12h36
  3. selectioner la premiere ligne de chaque group
    Par ____22 dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/02/2009, 08h34
  4. afficher les 10 premiers enregistrements pour chaque groupe
    Par freestyler dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/06/2008, 15h46
  5. Réponses: 2
    Dernier message: 07/03/2007, 16h30

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