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 SQL avec comptage


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 44
    Points : 27
    Points
    27
    Par défaut Requete SQL avec comptage
    Bonjour,

    Voici l’architecture de la base :


    Je voudrais faire une requête qui pour un ProfilID donné dresse la liste de tous les collaborateurs en calculant :

    1. Le nombre de compétences identiques qui sont rencontrés à la fois dans le profil et chez le collaborateur (si aucune 0)

    2. Le nombre total des compétences d'un profil


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CollaborateurID   Nom  Prenom      Nb Compétences / Total Compétences du profil
    ---------------+------+---------+----------------------------------------------
    Merci

  2. #2
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    1/
    Le nombre de compétences identiques qui sont rencontrés à la fois dans le profil et chez le collaborateur (si aucune 0)
    Tu peut détailler un peut plus ? tu voudrais avoir le nombre de compétences différentes présente chez un collaborateur, je ne comprend pas trop le sens de la question en rapport avec ce MCD.

    2/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT COUNT(*) AS nbCompetences
    FROM Profils
    INNER JOIN CompetencesProfils
    ON Profils.ProfilID = Competences.ProfilID;
    Ton MCD manque de cardinalité, ce qui implique que c'est difficile de voir les jointures a faire ni voir le sens de l'information.
    PS : La prochaine fois apporte déjà une solution perso, même si ça marche pas, ça aidera a t'aider, et tu aura plus de réponses

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Merci,

    1/ Je voudrais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1. Je me donne un profil
    2. Pour ce profil je regarde les compétences qui sont liées au profil
        2.i Je regarde les collaborateurs qui ont cette compétence
        2.j Si le collaborateur a cette compétence je l'incrémente de 1
             Je passe à la compétence suiavnte

  4. #4
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    hum donc si je comprend bien tu voudrais une résultat du type

    mes compétences :
    comp 1 : 3 collaborateur la possède
    comp 2 : 2
    comp 6 : 1
    comp 14 : 9

    c'est bien cela ?

  5. #5
    Membre averti Avatar de Sekigawa
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 432
    Points : 359
    Points
    359
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT CollaborateurID, nom, prenom, count(competencecollaborateurID) as nbcompcollabo, count(CompetencesProfilsID) as TotCompProf
    FROM Collaborateurs as C, CompetencesCollaborateurs as CC, Competences as Comp, CompetencesProfils as CP, Profils as P
    Where C.CollaborateurID = CC.CollaborateurID
    AND Comp.CompetencesID=CC.CompetencesCollaborateursID
    AND Comp.CompetenceID=CP.COmpetenceID
    AND CP.ProfilID=CP.ProfilID
    GROUP BY CollaborateurID, nom, prenom;
    Alors m'en veut pas pour les jointure je fais comme j'ai appris lol
    A tester

  6. #6
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Personne t'en voudras
    Je préconise plutôt l'utilisation des join en terme d'optimisation et de sens, mais après, c'est pas la fin de monde non plus

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Merci à tous,

    J'ai finalement réussi à faire une requête (il m'a fallu un après-midi). Mais cette requête n'est pas optimisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT Collaborateurs.CollaborateurID, Collaborateurs.Nom,
           COUNT(CompetencesCollaborateurs.CompetencesCollaborateursID) AS NbCompetences,
           (SELECT COUNT (*) FROM CompetencesProfils WHERE ProfilID = 24) AS NbTotCompetences
    FROM  Collaborateurs
    LEFT OUTER JOIN CompetencesCollaborateurs
           ON (CompetencesCollaborateurs.CollaborateurID = Collaborateurs.CollaborateurID)
    WHERE CompetencesCollaborateurs.CompetenceID IN (SELECT CompetencesProfils.CompetenceID
                                                     FROM CompetencesProfils
                                                     WHERE CompetencesProfils.ProfilID = 24)
          OR CompetencesCollaborateurs.CompetenceID IS NULL
    GROUP BY Collaborateurs.CollaborateurID, Collaborateurs.Nom
    Il y a peut être quelque chose de mieux à faire au niveau des jointures ? Des sous requetes ?

  8. #8
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    je pense que tu dois pouvoir essayer ça : (le IN est gourmand)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT      Collaborateurs.CollaborateurID, Collaborateurs.Nom, COUNT(CompetencesCollaborateurs.CompetencesCollaborateursID) AS NbCompetences, 
          (SELECT COUNT (*) FROM CompetencesProfils WHERE ProfilID = 24) AS NbTotCompetences  
    FROM  Collaborateurs
     
    LEFT OUTER JOIN ( CompetencesCollaborateurs 
    INNER JOIN CompetencesProfils 
    ON CompetencesCollaborateurs.CompetenceID = CompetencesProfils.CompetenceID and CompetencesProfils.CompetenceID = 24)
    )
     ON (CompetencesCollaborateurs.CollaborateurID = Collaborateurs.CollaborateurID)
      
    GROUP BY Collaborateurs.CollaborateurID, Collaborateurs.Nom
    [dans ton post, merci d'éditer pour supprimer les sauts de lignes, ça gène la lisibilité.]

  9. #9
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    Citation Envoyé par kazou Voir le message
    Personne t'en voudras
    Je préconise plutôt l'utilisation des join en terme d'optimisation et de sens, mais après, c'est pas la fin de monde non plus
    pas la fin du monde, mais la fin de la lisibilité

  10. #10
    Membre averti Avatar de Sekigawa
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 432
    Points : 359
    Points
    359
    Par défaut
    Citation Envoyé par say Voir le message
    pas la fin du monde, mais la fin de la lisibilité
    Bah là faut se plaindre à mes profs qui m'ont appris comme ça et qui banisse les join du moins pour l'examen

  11. #11
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    mouais...dans un soucis pédagogique...mais bon...vous l'apprendre c'est qd même incontournable.

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Citation Envoyé par Sekigawa Voir le message
    Bah là faut se plaindre à mes profs qui m'ont appris comme ça et qui banisse les join du moins pour l'examen
    Ben si tu veux te faire plaisir, tu leur écris des requêtes avec du JOIN bien indenté, qui donne le même résultat, est plus conforme, est bien plus lisible. Je ne pense pas qu'ils puissent te le reprocher et te forcer à écrire du WHERE surtout si tu es capable de faire les deux.

  13. #13
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Bah là faut se plaindre à mes profs qui m'ont appris comme ça et qui banisse les join du moins pour l'examen
    Le miens aussi ne t'inquette pas, mais ca ne m'empeche pas de garder mes convictions (qui sont de plus fondés), sur l'utilisation des where a bannir pour les jointures.

    Et puis ca serait quand meme fort qu'on nous pénalise pour ca

  14. #14
    Membre averti Avatar de Sekigawa
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 432
    Points : 359
    Points
    359
    Par défaut
    Citation Envoyé par kazou Voir le message
    Le miens aussi ne t'inquette pas, mais ca ne m'empeche pas de garder mes convictions (qui sont de plus fondés), sur l'utilisation des where a bannir pour les jointures.

    Et puis ca serait quand meme fort qu'on nous pénalise pour ca
    C'est clair je pense que c'est des mytho... il faut coder la méthode dont on est le plus à l'aise ^^

  15. #15
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    A vrais dire on est a l'aise très souvent avec la première technique que l'on découvre, et on enseigne très souvent les jointures par produit cartésien (le WHERE) et non pas par les join.
    C'est souvent acquis plus facilement par les élèves et accepté par les examen alors on peut comprendre qu'il déconseillent l'utilisation des join.donc il faut pas taper sur les profs il faut les comprendre.

    Nous dérivons un peu, nous égarons pas

  16. #16
    Membre averti Avatar de Sekigawa
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 432
    Points : 359
    Points
    359
    Par défaut
    Oui on divague mais bon j'ai pas encore accés à la Taverne...

    Mais bon sujet clos !!!

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par say Voir le message
    je pense que tu dois pouvoir essayer ça : (le IN est gourmand)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT Collaborateurs.CollaborateurID, Collaborateurs.Nom,
            COUNT(CompetencesCollaborateurs.CompetencesCollaborateursID) AS NbCompetences, 
           (SELECT COUNT (*) FROM CompetencesProfils WHERE ProfilID = 24) AS NbTotCompetences  
    FROM  Collaborateurs
    LEFT OUTER JOIN (CompetencesCollaborateurs 
                     INNER JOIN CompetencesProfils 
                                ON CompetencesCollaborateurs.CompetenceID = CompetencesProfils.CompetenceID
                                AND CompetencesProfils.CompetenceID = 24)
                     ON (CompetencesCollaborateurs.CollaborateurID = Collaborateurs.CollaborateurID)
    GROUP BY Collaborateurs.CollaborateurID, Collaborateurs.Nom
    [dans ton post, merci d'éditer pour supprimer les sauts de lignes, ça gène la lisibilité.]
    J'ai testé sous Access qui me dit "Expression de Jointure Non Supportée". Je me suis peut-être trompé dans une parenthèse ?

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Autre chose aussi j'ai essayé d'ajouter une ligne dans ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT Collaborateurs.CollaborateurID, Collaborateurs.Nom,
           COUNT(CompetencesCollaborateurs.CompetencesCollaborateursID) AS NbCompetences,
           (SELECT COUNT (*) FROM CompetencesProfils WHERE ProfilID = 24) AS NbTotCompetences,
           AVG(CompetencesProfils.Evaluation) AS MoyCompetences
    FROM  Collaborateurs
    LEFT OUTER JOIN CompetencesCollaborateurs
           ON (CompetencesCollaborateurs.CollaborateurID = Collaborateurs.CollaborateurID)
    WHERE CompetencesCollaborateurs.CompetenceID IN (SELECT CompetencesProfils.CompetenceID
                                                     FROM CompetencesProfils
                                                     WHERE CompetencesProfils.ProfilID = 24)
          OR CompetencesCollaborateurs.CompetenceID IS NULL
    GROUP BY Collaborateurs.CollaborateurID, Collaborateurs.Nom
    Mais il me dit que la paramètre n'a pas de valeur par défaut !

  19. #19
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    Citation Envoyé par mpereg Voir le message
    J'ai testé sous Access qui me dit "Expression de Jointure Non Supportée". Je me suis peut-être trompé dans une parenthèse ?
    peut-etre le OUTER, j'avais pas fait gaffe que tu étais sous Access.

  20. #20
    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
    Citation Envoyé par kazou Voir le message
    A vrais dire on est a l'aise très souvent avec la première technique que l'on découvre, et on enseigne très souvent les jointures par produit cartésien (le WHERE) et non pas par les join.
    C'est souvent acquis plus facilement par les élèves et accepté par les examen alors on peut comprendre qu'il déconseillent l'utilisation des join.donc il faut pas taper sur les profs il faut les comprendre.
    Bah oui, mais après les jeunes diplômés tombent sur des vieux schnocks autodidactes comme moi, qui les traitons d'ignares et de sagouins, et leur tirons l'oreille en leur demandant "c'est ça que tu as appris à l'école ???"

    (et du coup, ils ne savent pas faire une jointure externe )

Discussions similaires

  1. Requete SQL avec comptage
    Par Bos2007 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 25/03/2009, 07h12
  2. requete SQL avec valeur max
    Par oeil de nuit dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/01/2006, 08h58
  3. REQUETE SQL AVEC HAVING
    Par juju_77 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 05/08/2005, 09h49
  4. Probleme de requete SQL avec un champs date
    Par ju360modena dans le forum ASP
    Réponses: 5
    Dernier message: 16/06/2005, 11h18
  5. [JDBC] retour de requete sql avec valeur NULL
    Par maxxou dans le forum JDBC
    Réponses: 3
    Dernier message: 13/09/2004, 14h40

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