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 :

Problème avec une requête


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut Problème avec une requête
    Bonjour,
    j'ai un petit soucis avec une requête, je cherche à avoir la liste des personnes, qui ont un numéro de contrat présent dans plusieurs dossiers .
    Ma requête m'affiche bien en grande majorité la liste des personnes, avec même numéro de contrat, mais un numéro de dossier différents ( plusieurs lignes donc ), mais j'ai aussi les personnes avec un dossier unique, donc une seul ligne, et je veux les exclure, pour qu'il me reste les personnes, qui ont pour un même numéro de contrat plusieurs dossiers.

    Voici ma requete
    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
     
    select distinct t1.identifiant,
    t2.nom,
    t2.prenom,
    t3.nomContrat,
    t4.numerodossier
    from tabledossier t4
    inner join table1 t1 on t1.id=t4.idrefTable1
    inner join tInfoPersonne t2 on t2.idrefTable1 = t1.idrefTable1
    inner join tcontrat t3 t3.idrefTable1 = t1.idrefTable1
     
    table1(id,identifiant,...)
    tInfoPersonne(id, npm,prenom,idrefTable1)
    tContrat(id,nomContrat,....,idrefTable1)
    tabledossier(id,numerodossier,...,idrefTable1)
    J'avais pensé à faire un having, mais je sais pas trop comment m'y prendre avec ça.

    merci à vous

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    Si tu veux utiliser HAVING, il faut faire un regroupement au niveau du contrat sans détailler par dossier :
    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
     
    select distinct 
            t1.identifiant
        ,   t2.nom
        ,   t2.prenom
        ,   t3.nomContrat
    --     ,   t4.numerodossier      
    from    tabledossier    t4
        inner join 
            table1          t1 
            on  t1.id = t4.idrefTable1
        inner join 
            tInfoPersonne   t2 
            on  t2.idrefTable1 = t1.idrefTable1
        inner join 
            tcontrat        t3 
            on  t3.idrefTable1 = t1.idrefTable1
    group by t1.identifiant
        ,   t2.nom
        ,   t2.prenom
        ,   t3.nomContrat
    having  count(t4.numerodossier) > 1
    Si tu veux connaître les dossiers répondant à ce critère, il faut utiliser une autre méthode avec EXISTS :
    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
    select distinct 
            t1.identifiant
        ,   t2.nom
        ,   t2.prenom
        ,   t3.nomContrat
        ,   t4.numerodossier      
    from    tabledossier    t4
        inner join 
            table1          t1
            on  t1.id = t4.idrefTable1
        inner join
            tInfoPersonne   t2
            on  t2.idrefTable1 = t1.idrefTable1
        inner join
            tcontrat        t3
            on  t3.idrefTable1 = t1.idrefTable1
    where   exists
            (   select  null
                from    tabledossier    t5
                where   t1.id = t5.idrefTable1
                having  count(t5.numerodossier) > 1
            )
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut
    merci, la 1ere requete est bien elle correspond en partie.
    après quelques tests, pour une personne j'ai bien le nom, prenom numéro contrat, nombre de dossier(je l'ai rajouté)dans lequel le numéro de contrat se trouve:

    identifiant nom prenom nb_dossiers numero dossier num contrat
    123456 odile croc 4 8072248 300020665800000
    789654 cane gery 3 17067055 30002654564654000

    seulement je trouve un peu étrange que j'ai aussi peu de résultats, dans ma requête initiale j'ai 8300 lignes alors que celle ci ne me retourne que 18 lignes
    voici un exemple ce que j'obtiens avec ma requete initiale:

    identifiant nom prenom numero dossier num contrat
    123456 odile croc 8072248 300020665800000
    123456 odile croc 1234567 300020665800000
    123456 odile croc 98745sd 300020665800000
    123456 odile croc 52369870 300020665800000
    123456 odile croc 258147963 300020665800000
    789654 cane gery 222222222 30002654564654000
    789654 cane gery 111111111 30002654564654000
    789654 cane gery 3333333333 30002654564654000
    789654 cane gery 1555555555 30002654564654000
    789654 cane gery 184545454545 30002654564654000
    789654 cane gery 9898989898 30002654564654000


    est il possible donc que la liste des personnes, ayant pour chaque numéro contrat un numéro de dossier différent, en ne comptant pas les personnes ayant qu'un seul dossier ? un grand merci!

  4. #4
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut
    j'ai rien dis, je pense avoir saisie.

    Lorsque je fais la seconde requete
    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
     
     
    select distinct 
            t1.identifiant
        ,   t2.nom
        ,   t2.prenom
        ,   t3.nomContrat
        ,   t4.numerodossier      
    from    tabledossier    t4
        inner join 
            table1          t1
            on  t1.id = t4.idrefTable1
        inner join
            tInfoPersonne   t2
            on  t2.idrefTable1 = t1.idrefTable1
        inner join
            tcontrat        t3
            on  t3.idrefTable1 = t1.idrefTable1
    where   exists
            (   select  null
                from    tabledossier    t5
                where   t1.id = t5.idrefTable1
                having  count(t5.numerodossier) > 1
            )
    j'ai le message d'erreur suivant :s :

    ORA-00937: la fonction de groupe ne porte pas sur un groupe simple
    00937. 00000 - "not a single-group group function, j'ai un peu de mal à saisir :s

  5. #5
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select  1
    from    tabledossier    t5
    where   t1.id = t5.idrefTable1
    GROUP BY t5.numerodossier
    having  count(t5.numerodossier) > 1

  6. #6
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut
    Merci


    petite interrogation : pourquoi lors de mes tests ( et ça m'agace bien comme il faut), si je veux avoir les personnes qui ont un numéro de contrat dans plusieurs dossiers, malgré le having count >1, lors de mes tests, j'ai toujours des lignes récalcitrantes qui n'ont rien à faire là.

    Je m'explique:
    test 1 : je prend son numero dossier, j'ai bien plusieurs n° de contrat : ok
    test 2 : 1 numero et là j'ai 1 seul contrat : KO
    test 3 : 1 numero de dossier et là j'ai 3 numero contrat donc là ok

    pourtant j'ai bien ma requête bête et idiote qui dit que je veux ma liste de personne avec mon having count n°dossier>1, vous auriez une idée sur la question ou c'est sqldevelopper qui a décidé de m'agacer pour rester politiquement correct lol ?
    p.s : meme si je fais mon having count numdossier > 2 , il me met des lignes unique :s


    merci à vous

Discussions similaires

  1. [TADOQuery] Problème avec une requête
    Par yannba dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/01/2006, 13h51
  2. Problème avec une requête
    Par demonark dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/09/2005, 05h35
  3. Problème avec une requête
    Par ringostarr dans le forum Langage SQL
    Réponses: 5
    Dernier message: 19/04/2005, 20h34
  4. Problème avec une requête
    Par snoopy69 dans le forum Débuter
    Réponses: 2
    Dernier message: 20/01/2005, 12h39
  5. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29

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