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 :

requete avec jointure & group by


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut requete avec jointure & group by
    bonjour à tous,
    je travail en oracle 8i.
    voici mes tables en entree :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    table ELEMENT
    Cod_Elp
    Cod_Ann
    LIBELLE
     
    table croise INDIVIDU
    Cod_ELP
    Cod_Anu
    Cod_Ind
    je souhaite à partir de ces 2 tables, connaitre
    pour une annee precise
    le nombre d'invidu inscrit à l'element ( meme s'il n'y en a pas)
    le libelle
    ma requete fonctionne uniquement s'il y a des individus inscrits, sinon elle ne me renvoie pas les autres elements.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT ELP.Cod_Elp, COUNT(IND.Cod_Ind). LIBELLE
    FROM ELEMENT ELP , INDIVIDU IND
    WHERE ELP.Cod_Elp = IND.Cod_ELP (+)
    GROUP BY  IND.Cod_ELP
    HAVING IND.Cod_Anu = '2004';
    j'ai aussi essaye en comptant le cod_anu au lieu de cod_ind .

    merci d'avance

  2. #2
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    je te propose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT ELP.Cod_Elp, decode(IND.Cod_Ind,Null,0,not null,count(Cod_Ind)), LIBELLE 
    FROM ELEMENT ELP , INDIVIDU IND 
    WHERE ELP.Cod_Elp = IND.Cod_ELP (+) 
    And  IND.Cod_Anu = '2004'
    GROUP BY  IND.Cod_ELP ,LIBELLE
    A+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    en fait, ce n'est pas le cod_ind qui est null
    mais le fait de son existance dans la table croisee

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ELEMENT                                         INDIVIDU
    ELP1                                                ELP1
    2004                                                2004                        
    LIB_ELP1                                          IND1           
     
    ELP2
    LIB_ELP2
    je veux selectionner les ELEMENT (code element, libelle) de l'annee 2004
    et connaitre le nombre d'invidus inscrit a cettre ELEMENT pour une annee precise.
    le resultat doit etre:

    COD_ELP LIBELLE COUNT(COD_IND)
    ELP1 LIB_elp1 1
    ELP2 LIB_elp2 0

    j'espere avoir ete plus clair
    A+

  4. #4
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    en fait, ce n'est pas le cod_ind qui est null
    mais le fait de son existance dans la table croisee
    oui le cod_ind n'est pas null, c'est dans select, suite à la jointure externe, qu'il apparaitra null, quand il ne se trouve dans aucun élèment.

    As tu essayé la requête, que donne t'elle comme resultat?

    ORACLE, cela fait longtemps que j'ai fait et je n'ai gardé que quelques instructions.


    count(cod_ind ) ne te ramène pas la ligne si cod_ind is null.
    A+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    cela ne fonctionne pas

    il ne me ramene pas la ligne

    peut etre faire le count dans une sous-requete mais c'est plus gourmand en temps.

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ELP.Cod_Elp, count(Cod_Ind), LIBELLE 
    FROM ELEMENT ELP , INDIVIDU IND 
    WHERE ELP.Cod_Elp   = IND.Cod_ELP(+)
    And  ELP.Cod_Ann = '2004' 
    GROUP BY  ELP.Cod_ELP ,LIBELLE ;
    J'ai supposé que l'absence de 2004 dans le deuxième enregistrement de la table ELEMENT était un oubli.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  7. #7
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    je ne sais pas si cette syntaxe est correcte


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT ELP.Cod_Elp, decode(IND.Cod_Ind,Null,0,not null,count(Cod_Ind)), LIBELLE 
    FROM ELEMENT ELP , INDIVIDU IND 
    WHERE ELP.Cod_Elp = IND.Cod_ELP (+)
    AND   ELP.cod_Ann=  IND.Cod_Anu (+)
    And   ELP.cod_Ann = '2004' 
    GROUP BY  IND.Cod_ELP ,LIBELLE

    je connais beacoup plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT ELP.Cod_Elp, decode(IND.Cod_Ind,Null,0,not null,count(Cod_Ind)), LIBELLE 
    FROM ELEMENT ELP left outer join INDIVIDU IND 
    ON ELP.Cod_Elp = IND.Cod_ELP 
    AND   ELP.cod_Ann=  IND.Cod_Anu 
    where   ELP.cod_Ann = '2004' 
    GROUP BY  IND.Cod_ELP ,LIBELLE
    je pense que le problème viens de ta condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    And   ELP.cod_Ann = '2004'
    qui élimine la ligne.

    A+¨

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    oui, j'ai vraiment l'impression que le pb est la

    mais ce qui est bizare , c'est le fait de ramener 0 quand il n'y a pas de ligne et de ne rien ramener quand la ligne qui n'existe pas ne rentre pas dans le predicat.

    comme si sql ne pouvait pas faire les 2 en meme temps.

    alors quelle solution non gourmande puis essayer, j'ai à peu pres 3000 ELP par an et actuellement 1 500 000 enreg dans INDIVIDU. ?

  9. #9
    Tan
    Tan est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 168
    Points : 158
    Points
    158
    Par défaut
    Celle-ci te donne le nombre d'individus pour l'année 2004 et le nombre non affecté à une année:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ELP.Cod_Elp, COUNT(IND.Cod_Ind). LIBELLE 
    FROM ELEMENT ELP , INDIVIDU IND 
    WHERE ELP.Cod_Elp = IND.Cod_ELP (+) 
    GROUP BY  IND.Cod_ELP, libelle, cod_anu
    HAVING IND.Cod_Anu = '2004' or IND.Cod_Anu is null;
    Celle-ci regroupera par année (plus un groupe de null, normalement):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ELP.Cod_Elp, COUNT(IND.Cod_Ind). LIBELLE 
    FROM ELEMENT ELP , INDIVIDU IND 
    WHERE ELP.Cod_Elp = IND.Cod_ELP (+) 
    GROUP BY  IND.Cod_ELP, libelle, cod_anu
    Dis, si ça ne correspond pas à ce que tu veux, car j'i du mal à comprendre si c'est pas ça.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    apres recherche et essais de vos propositions, voici la requete qui fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT distinct(elp.cod_elp), count(ind.cod_ind), LIBELLE
               FROM ELEMENT Elp ,
               INDIVIDU Ind 
               where elp.cod_elp=ind.cod_elp(+)
              and (ind.cod_anu = '2003' or ind.cod_anu is null)
              group by ind.cod_elp,elp.cod_elp,LIBELLE ;
    sans la close 'ind.cod_anu is null' , cela ne donne pas le nombre d'individu inscrit

    merci à tous les 3.

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

Discussions similaires

  1. Requete avec Jointure et groupe
    Par coeurdange dans le forum SQL
    Réponses: 5
    Dernier message: 10/06/2015, 17h25
  2. [ADO] Requete avec jointure
    Par okparanoid dans le forum Bases de données
    Réponses: 6
    Dernier message: 08/11/2006, 17h05
  3. recherche aide pour requete avec jointure
    Par nebil dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/08/2006, 17h03
  4. [MySQL] Erreur dans une requête avec jointures
    Par bobic dans le forum Langage SQL
    Réponses: 17
    Dernier message: 03/08/2006, 13h04
  5. Requete avec max et group by
    Par Maxime555 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/07/2006, 11h48

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