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

SQL Oracle Discussion :

[Oracle] Selection du dernier contrat


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Par défaut [Oracle] Selection du dernier contrat
    Bon, je vous embete encore une fois...

    J'ai une table agents_contrats qui contient (entre autre) les champs NOM, PRENOM, MATRICULE, NUMERO_CONTRAT

    Une personne peut y apparaitre plusieurs fois avec différents numeros de contrats par exemple:

    NOM PRENOM MATRICULE NOCONTRAT
    tata tutu 0548 01
    toto titi 0123 01
    toto titi 0125 02
    toto titi 0124 03
    tete mumu 0587 01
    Le but etant de recuperer toutes les lignes de la table agents_contrat mais donc sans doublons (sur les nom et prenom des gens).
    Donc, dans mon exemple, on retournerait:

    tata tutu 0548 01
    toto titi 0124 03
    tete mumu 0587 01
    La table complete sans les doublons pour lesquels on les remplace par celui qui a le dernier numero de contrat.

    J'ai ecrit ca pour le moment (pour vous montrer que je cherche quand meme!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select distinct agt.NOM, agt.PRENOM, agt.NUMERO_CONTRAT from
    (select NOM, PRENOM, NUMERO_CONTRAT from agents_contrats
     group by nom, prenom, NUMERO_CONTRAT
     order by NUMERO_CONTRAT desc) req,
    agents_contrats agt
    where agt.NOM=req.NOM and agt.PRENOM = req.PRENOM
    order by NUMERO_CONTRAT desc;
    Et cette requete me retourne tous les elements de la table triés par le numero de contrat mais je n'arrive pas a ne selectionner que le dernier...

    Merci de votre aide

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Par défaut
    Bon, j'ai peut etre une piste. Je peux transformer la colonne NUMERO_CONTRAT en number et en recuperer le max.
    Mais le reste de la requete me semble encore tres flou...

  3. #3
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 66
    Par défaut
    Si tu peux avoir le numero de contrat en numérique, alors ce sera encore plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT agt.NOM, agt.PRENOM, MAX(agt.NUMERO_CONTRAT) AS NUMERO_CONTRAT
    FROM agents_contrats agt
    GROUP BY agt.NOM, agt.PRENOM
    ORDER BY NUMERO_CONTRAT DESC;

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Par défaut
    Merci, c'est gentil! Mais pour une fois, j'avais reussi a ecrire la requete avant que vous me donniez la solution!!! Et c'est la MEME! Je suis pas si quiche que ca on dirais!!!
    Merci en tout cas et je regarde le lien que vous m'avez donné

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Par défaut
    Et voici la requete que j'ai ecrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select distinct agt.NOM, agt.PRENOM, req.maxi from agents_contrats agt,
    (
    select  MAX (numero_contrat) maxi, NOM, PRENOM from agents_contrats agt
    group by NOM, PRENOM
    order by NOM, PRENOM
    ) req
    where agt.NOM = req.NOM and agt.PRENOM = req.PRENOM
    order by agt.NOM, agt.PRENOM
    Maintenant, cette requete doit alimenter une nouvelle table. Je dois encore ecrire ca...

    Merci a vous, vous etes littéralement géniaux! Je vous respecte parce que les bases de données, c'est chaud quand meme!


  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 66
    Par défaut
    Je suis pas certain que ta requête soit juste :
    - D'abord je m'interroge sur l'intérêt de la sous-requête;
    - Ensuite si tu as deux agents qui ont des prénoms différents mais le même nom, il y en a un qui n'apparaitra pas dans les résultats.

    As-tu essayé ma proposition ?

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Cyrano vous avez occulté dans votre requête le numéro de matricule, qui n'est ni clef de regroupement ni clef de dédoublonnage.

    Il faut donc bien faire une sous-requête.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 66
    Par défaut
    Très juste, je vais de ce pas me cacher

  10. #10
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Par défaut
    Bonjour...

    Bon, j'ai pas le moral moi!

    Je viens de voir mon chef et visiblement la requete que j'ai ecrit (avec votre aide) ne me servira a rien... Grrrr
    Il va falloir que j'utilise deux curseurs imbriqués et une serie de requetes chiadées...
    Et vous avez evidement remarqué que mes capacités en sql sont tres tres limitées!
    Je vous remercie par avance de l'aide que vous m'apporterez!

    Bonne soirée

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Par défaut
    Bon, j'ai une autre question...

    Voici mon code (c'est la requete que je vais utiliser un curseur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT agt.matricule, agt.date_debut_contrat
      FROM agents_contrats_sauve agt
     WHERE agt.date_debut_contrat = 
     (
     SELECT   agt2.date_debut_contrat
                   FROM agents_contrats_sauve agt2
                  WHERE ROWNUM = 1
                    AND agt.nom = agt2.nom
                    AND agt.prenom = agt2.prenom
    				ORDER BY agt.date_debut_contrat, agt.matricule)
    Et ca me sort une erreur sur la parenthese de droite...
    Je me suis renseigné et visiblement, on peut pas faire un order by dans une sous requete...
    Et je fais comment moi?! :p
    NaméhOOOoo c'est quoi ce bordel?

    J'ai besoin de cet order by a cause du RowNum = 1... Si je peux pas trier, la sous requete me retourne n'imp' du coup.

    Comment vous evitez ce piege vous?

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Par défaut
    Bon, j'ai écrit ca du coup:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT agt.matricule
      FROM agents_contrats_sauve agt
     WHERE agt.date_debut_contrat = 
     (
     SELECT   max(agt2.date_debut_contrat)
                   FROM agents_contrats_sauve agt2
                    where agt.nom = agt2.nom
                    AND agt.prenom = agt2.prenom)
    Visiblement ca me fait le bon resultat alors sauf si vous me dites que c'est mort, je vais utiliser cette petite requete sortie de derriere les fagots!

  13. #13
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Tu n'as pas besoin de la subquery(sous-requête).

    mais une personne qui a plusieurs matricules, je pense qu'il y a quelque chose d'anormal.
    Salim.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT   nom, prenom,
             MAX (matricule)KEEP (DENSE_RANK LAST ORDER BY nocontrat) matricule,
             MAX (nocontrat)KEEP (DENSE_RANK LAST ORDER BY nocontrat) nocontrat
        FROM agents_contrats
    GROUP BY nom, prenom;
    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
    22
    23
    24
    25
    26
    27
    28
    29
     
    SQL> WITH agents_contrats AS
      2       (SELECT 'tata' nom, 'tutu' prenom, '0548' matricule, '01' nocontrat
      3          FROM DUAL
      4        UNION ALL
      5        SELECT 'toto', 'titi', '0123', '01' nocontrat
      6          FROM DUAL
      7        UNION ALL
      8        SELECT 'toto', 'titi', '0125', '02' nocontrat
      9          FROM DUAL
     10        UNION ALL
     11        SELECT 'toto', 'titi', '0124', '03' nocontrat
     12          FROM DUAL
     13        UNION ALL
     14        SELECT 'tete', 'mumu', '0587', '01' nocontrat
     15          FROM DUAL)
     16  SELECT   nom, prenom,
     17           MAX (matricule)KEEP (DENSE_RANK LAST ORDER BY nocontrat) matricule,
     18           MAX (nocontrat)KEEP (DENSE_RANK LAST ORDER BY nocontrat) nocontrat
     19      FROM agents_contrats
     20  GROUP BY nom, prenom;
     
    NOM  PREN MATR NO
    ---- ---- ---- --
    tata tutu 0548 01
    tete mumu 0587 01
    toto titi 0124 03
     
    SQL>

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

Discussions similaires

  1. [Oracle] SELECT et une condition IF => possible ?
    Par philuciole dans le forum Langage SQL
    Réponses: 25
    Dernier message: 14/09/2007, 14h40
  2. effectuer une selection des derniers états
    Par phpaide dans le forum Requêtes
    Réponses: 3
    Dernier message: 16/11/2006, 13h08
  3. [Oracle] select count
    Par joaninha dans le forum Langage SQL
    Réponses: 8
    Dernier message: 28/07/2006, 09h21
  4. [Oracle] SELECT from an UNION
    Par magic charly dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/05/2006, 17h48
  5. [Oracle] selection du max en groupand par date
    Par pelo68 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 05/05/2006, 22h05

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