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 :

Problème pour afficher les 5 dernière interventions


Sujet :

Langage SQL

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Points : 353
    Points
    353
    Par défaut Problème pour afficher les 5 dernière interventions
    Bonjour tout le monde,

    J'ai une table intervention ou je souhaiterais afficher les 5 dernières interventions selon les numéros d'interventions.

    EXEMPLE : dans ma table intervention j'ai : IN_NUMINTER..... ce champ est de la forme suivante (année/mois/jours-001).
    Par exemple pour le client "hf", on a les interventions suivante :
    2008/02/01-001
    2008/02/05-001
    2008/02/05-002
    2008/02/05-003
    2008/02/05-004
    2008/02/05-005
    Moi je souhaiterais qu'il m'affiche les 5 dernières selon la date donc selon le mois et le jour donc dans mon exemple cela m'afficherer
    2008/02/05-001
    2008/02/05-002
    2008/02/05-003
    2008/02/05-004
    2008/02/05-005

    j'ai commencer a faire quelque truc mais suis bloqué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT IN_NUMCLT, IN_NUMINTER 
    FROM INTERVENTION, CLIENT 
    WHERE CLIENT.C_NUMCLT=INTERVENTION.IN_NUMCLT AND C_NUMCLT='hf'
    en fait ce que j'arrive pas c'est d'afficher juste les 5 dernier.

    comment je peux faire??

    merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 102
    Points : 31 543
    Points
    31 543
    Billets dans le blog
    16
    Par défaut
    Il s'agit a priori d'un problème dit de quota queries.

    Voyez :

    http://www.developpez.net/forums/sho...d.php?t=466073

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    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 102
    Points : 28 392
    Points
    28 392
    Par défaut
    Pour répondre à ce type de problème, différentes solutions peuvent être prposées qui dépendent des capacités de votre SGBD
    En précisant le SGBD que vous utilisez et sa version, les réponses proposées seront adaptées aux spécificités et limitations de celui-ci.
    Règles du forum Langage SQL à lire par tous

  4. #4
    Débutant  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Points : 353
    Points
    353
    Par défaut réponse à fsmrel et à al1_24
    réponse à fsmrel : Mon problème est tout simplement que je ne voit pas comment traduire la chose suivante "afficher les 5 dernières interventions"

    réponse à al1_24 : Oui je suis désolé j'ai oublié d ele préciser, il me sembler que je l'avais fais mais on dirait que non(désolé). Sinon j'utilise SqlServer2000.

    merci d'avance pour votre aide

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Points : 353
    Points
    353
    Par défaut
    J'ai réussit a trouver comment afficher le dernier mais comment puis-je faire pour afficher les 4 qui se situe avant le dernier?? (tout simplement pour obtenir les 5 dernières)

    merci d'avance!!

  6. #6
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 102
    Points : 31 543
    Points
    31 543
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par loic20h28
    Mon problème est tout simplement que je ne voit pas comment traduire la chose suivante "afficher les 5 dernières interventions"
    Reprenons, sur la base de l’exemple suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Create Table Intervention
    (IN_NUMCLT        Char(04)  not null,
     IN_NUMINTER      Char(14)  not null
    )
    ;
    Insert Into Intervention values ('hf', '2008/02/01-001') ;
    Insert Into Intervention values ('hf', '2008/02/05-001') ;
    Insert Into Intervention values ('hf', '2008/02/05-002') ;
    Insert Into Intervention values ('hf', '2008/02/05-003') ;
    Insert Into Intervention values ('hf', '2008/02/05-004') ;
    Insert Into Intervention values ('hf', '2008/02/05-005') ;
    On procède à une auto-jointure de la table Intervention afin de comparer chaque intervention à ses petites sœurs (sous-entendu pour un client donné) et en comptant le nombre de comparaisons, disons d’infériorité.

    Combien de fois la valeur '2008/02/01-001' est-elle inférieure aux autres ? 5 fois, ce qui est excessif pour la condition imposée. Cette valeur est donc disqualifiée et ne figurera pas dans le résultat.

    Combien de fois la valeur '2008/02/05-001' est-elle inférieure aux autres ? 4 fois, ce qui est satisfaisant pour la condition imposée. Cette valeur est donc qualifiée et figurera dans le résultat.

    Combien de fois la valeur '2008/02/05-002' est-elle inférieure aux autres ? 3 fois, ce qui est satisfaisant pour la condition imposée. Cette valeur est donc qualifiée et figurera dans le résultat.

    Etc.

    Formulation SQL (je vous laisse le soin de filtrer par client) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Select  x.IN_NUMINTER
    From    Intervention as x
    Where  (Select count(*)
            From   Intervention as y
            Where  x.IN_NUMINTER < y.IN_NUMINTER
          ) < 5

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Points : 353
    Points
    353
    Par défaut
    Merci pour ce bout de code mais je voit pas ou mettre "par client" je sait et je pense qu'il faut que j'utilise un goup by mais je voit pas trop ou le placer car a chaque fois rien ne fait.

    merci d'avance et désolé de te déranger ainsi.

  8. #8
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 102
    Points : 31 543
    Points
    31 543
    Billets dans le blog
    16
    Par défaut
    Merci pour ce bout de code mais je voit pas ou mettre "par client" je sait et je pense qu'il faut que j'utilise un goup by mais je voit pas trop ou le placer car a chaque fois rien ne fait.
    Il suffit de préciser, au niveau de l'auto-jointure, qu'on ne compare pas les interventions de clients différents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Select  x.IN_NUMCLT, x.IN_NUMINTER 
    From    Intervention as x
    Where   (Select count(*)
             From   Intervention as y
             Where  x.IN_NUMCLT = y.IN_NUMCLT  
             And    x.IN_NUMINTER < y.IN_NUMINTER
            ) < 5

  9. #9
    Débutant  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Points : 353
    Points
    353
    Par défaut réponse à fsmrel
    Bonjour,

    Je comprend pas trop ce qui se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Select  x.IN_NUMCLT, x.IN_NUMINTER 
    From    INTERVENTION as x
    Where   (Select count(*)
             From   INTERVENTION as y
             Where  x.IN_NUMCLT = y.IN_NUMCLT  
             And    x.IN_NUMINTER < y.IN_NUMINTER
            ) < 5
    il m'affiche toute les interventions qui existe dans ma base ainsi que celle correspondant a d'autre client.
    Le NUMCLT se situe en clé primaire dans la table CLIENT et en clé étrangère dans INTRVENTION.

    Merci d'avance!!

  10. #10
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 102
    Points : 31 543
    Points
    31 543
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par loic20h28
    il m'affiche toute les interventions
    Si vous avez utilisé la requête que je vous ai fournie (complétée d'un Order by x.IN_NUMCLT, x.IN_NUMINTER pour y voir plus clair), vous ne devez avoir que 5 interventions par client.

    Si vous ne souhaitez avoir que les 5 dernières interventions du client "hf" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  x.IN_NUMCLT, x.IN_NUMINTER 
    FROM    INTERVENTION AS x
    WHERE   (SELECT Count(*)
             FROM   INTERVENTION AS y
             WHERE  x.IN_NUMCLT = y.IN_NUMCLT  
             AND    x.IN_NUMINTER < y.IN_NUMINTER
            ) < 5
    And     x.IN_NUMCLT = 'hf'

  11. #11
    Débutant  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Points : 353
    Points
    353
    Par défaut réponse à fsmrel
    Je te remercie pour ton aide.

    Cela fonctionne comme je le souhaite lorsque j'effectue cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Select  x.IN_NUMINTER
    From    INTERVENTION as x
    Where   (Select count(*)
             From   INTERVENTION as y
             Where  x.IN_NUMCLT = y.IN_NUMCLT  
             And    x.IN_NUMINTER < y.IN_NUMINTER
            ) < 5
    And     x.IN_NUMCLT = 'hf'
    ORDER BY x.IN_NUMINTER DESC;
    car ça m'affiche parfaitement les 5 dernières :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    2008/04/05-001
    2008/03/10-002
    2008/03/05-001
    2008/02/15-002
    2008/02/05-001
    par contre, si j'effectue la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Select  x.IN_NUMINTER, c.CT_NOMCTACT, m.M_NOMMAT
    From    INTERVENTION as x, MACHINE as m, CONTACT as c
    Where   (Select count(*)
             From   INTERVENTION as y
             Where  x.IN_NUMCLT = y.IN_NUMCLT  
             And    x.IN_NUMINTER < y.IN_NUMINTER
            ) < 5
    And     x.IN_NUMCLT=m.M_NUMCLT
    And     m.M_NUMCTACT = c.CT_NUMCTACT
    And     x.IN_NUMCLT = 'hf'
    ORDER BY x.IN_NUMINTER DESC;
    c'est à dire que ça m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    2008/04/05-001	gr                  	sd
    2008/04/05-001	sx                  	vhfvj
    2008/03/10-002	sx                  	vhfvj
    2008/03/10-002	gr                  	sd
    2008/03/05-001	gr                  	sd
    2008/03/05-001	sx                  	vhfvj
    2008/02/15-002	sx                  	vhfvj
    2008/02/15-002	gr                  	sd
    2008/02/05-001	gr                  	sd
    2008/02/05-001	sx                  	vhfvj
    si on regarde bien, ça m'affiche tout en double.
    Je vois pas pourquoi?? et comment résoudre ce problème??

    merci d'avance!!

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    Pour info, sur Oracle, ce genre de requête tient 2 lignes grâce aux fonctions analytiques, qui plus est sont très performantes.
    Est-ce que ce type de fonction n'existerait pas sous SQL Server par hasard ?

  13. #13
    Débutant  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Points : 353
    Points
    353
    Par défaut
    Peut être mais qu'appel tu "fonctions analytiques" ??

    merci d'avance!!

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    Je te donne le lien du tutoriel sur le site :
    http://lalystar.developpez.com/fonct...lytiques/#L3.2

  15. #15
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 102
    Points : 31 543
    Points
    31 543
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par loic20h28
    si on regarde bien, ça m'affiche tout en double.
    Je vois pas pourquoi?? et comment résoudre ce problème??
    Vous faites mention de tables dont on ne sait rien concernant la structure (notamment des clés) et le contenu. Difficile de donner un avis dans ces conditions !

  16. #16
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    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 102
    Points : 28 392
    Points
    28 392
    Par défaut
    Même si elles ne sont pas implémentées dans tous les SGBD, les fonctions de regroupement analytiques sont définies depuis 2003 dans la norme ANSI

  17. #17
    Débutant  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Points : 353
    Points
    353
    Par défaut réponse à fsmrel
    Vous faites mention de tables dont on ne sait rien concernant la structure (notamment des clés) et le contenu. Difficile de donner un avis dans ces conditions !
    pour répondre a cela, je met ci joint un document word avec le schéma MCD et MPD des tables Intervention, Machine, Client et contact.

    Dans le contexte de ce forum, l'objet n'est pas de faire de l'Oracle ou du SQL Server (et s'en rendre ainsi prisonnier), mais —à moins que je me sois trompé de forum— plus simplement du SQL, portable tant qu'à faire.
    Certe je suis d'accord avec toi sur ce point. Mes requêtes doivent être portable vers sqlServer.

    merci d'avance pour tout ton aide.

  18. #18
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 102
    Points : 31 543
    Points
    31 543
    Billets dans le blog
    16
    Par défaut
    A l’attention de Loic20h28 :


    A priori, La table Intervention n’est pas dans le coup. Déjà, la requête ci-dessous (qui est une extraction de la précédente) affiche toutes les machines en relation avec un contact, si l’on se fie au MCD.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT  c.CT_NOMCTACT, m.M_NOMMAT
    FROM    MACHINE AS m, CONTACT AS c
    WHERE   m.M_NUMCTACT = c.CT_NUMCTACT
    AND     c.CT_NUMCLT = 'hf'

  19. #19
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Je reviens sur la première demande...
    Citation Envoyé par loic20h28 Voir le message

    j'ai commencer a faire quelque truc mais suis bloqué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT IN_NUMCLT, IN_NUMINTER 
    FROM INTERVENTION, CLIENT 
    WHERE CLIENT.C_NUMCLT=INTERVENTION.IN_NUMCLT AND C_NUMCLT='hf'
    en fait ce que j'arrive pas c'est d'afficher juste les 5 dernier.
    fsmrel t'a donné la solution normalisée. Il existe une solution beaucoup plus simple, mais qui est spécifique à SQL Server :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TOP 5 IN_NUMCLT, IN_NUMINTER 
    FROM INTERVENTION, CLIENT 
    WHERE CLIENT.C_NUMCLT=INTERVENTION.IN_NUMCLT AND C_NUMCLT='hf' 
    ORDER BY IN_NUMINTER DESC

  20. #20
    Débutant  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Points : 353
    Points
    353
    Par défaut réponse à Antoun
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT TOP 5 IN_NUMINTER, CT_NOMCTACT, M_NOMMAT
    FROM INTERVENTION, CONTACT, MACHINE 
    WHERE INTERVENTION.IN_NUMCLT=MACHINE.M_NUMCLT
    AND  MACHINE.M_NUMCTACT=CONTACT.CT_NUMCTACT
    AND IN_NUMCLT='hf' 
    ORDER BY IN_NUMINTER DESC;
    voici ma requête mais le problème c'est que ça m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    IN_NUMINTER             CT_NOMCTACT         M_NOMMAT
    2008/04/05-001	            gr                  	sd
    2008/04/05-001	            sx                  	vhfvj
    2008/03/10-002	            gr                  	sd
    2008/03/10-002	            sx                  	vhfvj
    2008/03/05-001	            gr                  	sd
    Ce qui est pas normal c'est que ça répéte 2 fois le même IN_NUMINTER alors qu'il existe qu'une fois dans la base.
    Il devrais plutôt m'afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    IN_NUMINTER               
    2008/02/05-001
    2008/02/15-002
    2008/03/05-001
    2008/03/10-002
    2008/04/05-001
    D'ou vient le problème!!

    merci d'avance!!
    P.S : je renvoie ci-joint le document word avec le schéma, si ça peux aider.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [CR XI] Problème pour afficher les etats sur windows 7
    Par regisyves dans le forum SAP Crystal Reports
    Réponses: 11
    Dernier message: 06/02/2012, 09h43
  2. [CR 2008] Problème pour afficher les paramètres
    Par bens67 dans le forum Débuter
    Réponses: 6
    Dernier message: 03/01/2011, 13h51
  3. TDC; problème pour afficher les items
    Par elise1983 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/10/2007, 15h17
  4. Réponses: 1
    Dernier message: 10/10/2007, 10h02

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