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

MS SQL Server Discussion :

Probléme avec une Requête select plusieurs count avec le regroupement ?


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 67
    Points : 43
    Points
    43
    Par défaut Probléme avec une Requête select plusieurs count avec le regroupement ?
    Bonjour à tous , pendant une longue recherche sur internet j'ai trouvé comment faire une select des pluiseurs count dans la même requête ,mais j'ai un problème au niveau de regroupement . bon je vous explique , je travaille sur une application de gestion des candidatures et j'ai deux tables principale , table candidat et la table Suivi (suivi des candidatures) qui contient trois entretien :
    1-entretien téléphonique ,
    2-entretien RH ,
    3-Entretien technique ,
    avec chaque entretien et son appréciation et le recruteur qui a passé l'entretien . Alors mon besoin c'est de faire un tableau de bord par une envoyer un requête qui va me retourner :
    1-le nombre de candidats contacté en entretien tel par l'un des recruteur c-à-d qu'il que soit l'appréciation (validé ou Non).
    2-le nombre de candidats validé en entretien tel par l'un des recruteur c-à-d qu'il l'appréciation est(validé).
    3-le nombre de candidats Présenté en entretien RH c-à-d que soit l'appréciation (validé ou Non).
    4-le nombre de candidats validé en entretien RH par l'un des recruteur c-à-d l'appréciation est (validé).
    5-le nombre de candidats Présenté en entretien Technique c-à-d qu'il que soit l'appréciation (validé ou Non).
    6-le nombre de candidats validé en entretien Technique c-à-d qu'il l'appréciation est (validé).

    je pense que jusque là tout est bien clair , et pour faire ça j'ai créer cette 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
    14
    15
    16
    SELECT * FROM 
    //----------------------------------------------Entretien Tel----------------------------------------------------------------- 
    ---------------------------------------------- requete 1----------------------------- 
    (SELECT count(s.idcandidat), s.Recruteur_Tel AS Contacte_Par FROM candidat AS c, suivi AS s WHERE c.idcandidat=s.idcandidat and s.Commentaire_Tel<>"" and YEAR(s.Date_EntretienTel)='2014' and MONTH(s.Date_EntretienTel)='9' GROUP BY s.Recruteur_Tel) AS CVContacte, 
    ---------------------------------------------- requete 2----------------------------- 
    (SELECT count(s.idcandidat), s.Recruteur_Tel AS ValideEnTelephone_Par FROM candidat AS c, suivi AS s WHERE c.idcandidat=s.idcandidat and s.Validation_Tel="Validé" and YEAR(s.Date_EntretienTel)='2014' and MONTH(s.Date_EntretienTel)='9' GROUP BY s.Recruteur_Tel) AS CVContacteValide, 
    //-------------------------------------------------Entretien RH---------------------------------------------------------------------
     ---------------------------------------------- requete 3----------------------------- 
    (SELECT count(s.idcandidat) FROM candidat AS c, suivi AS s WHERE c.idcandidat=s.idcandidat and s.Commentaire_RH<>"" and YEAR(s.Date_EntretienRH)='2014' and MONTH(s.Date_EntretienRH)='9') AS EntrRH, 
    ---------------------------------------------- requete 4----------------------------- 
    (SELECT count(s.idcandidat), s.Recruteur_RH AS ValideEnRH_Par FROM candidat AS c, suivi AS s WHERE c.idcandidat=s.idcandidat and s.Validation_RH="Validé" and YEAR(s.Date_EntretienRH)='2014' and MONTH(s.Date_EntretienRH)='9' GROUP BY s.Recruteur_RH) AS EntrRHValide, 
    //----------------------------------------------Entretien Technique----------------------------------------------------------------- 
    ---------------------------------------------- requete 5----------------------------- 
    (SELECT count(s.idcandidat) FROM candidat AS c, suivi AS s WHERE c.idcandidat=s.idcandidat and s.Commentaire_Ops<>"" and YEAR(s.Date_EntretienSM)='2014' and MONTH(s.Date_EntretienSM)='9') AS EntrOPS, 
    ---------------------------------------------- requete 6----------------------------- 
    (SELECT count(s.idcandidat),s.Recruteur_Tech as valideEnTech_Par FROM candidat AS c, suivi AS s WHERE c.idcandidat=s.idcandidat and s.ValidationSM_Sup="Validé" and YEAR(s.Date_EntretienSM)='2014' and MONTH(s.Date_EntretienSM)='9' group by s.Recruteur_Tech) AS EntrOPSValide;
    alors mon j'ai deux probléme avec cette requête le premier :
    1 - quand je veux regrouper avec le recruteur dans l'entretien technique (mentionné en bleu au dessus dans le code) ,et si il ne trouve aucune candidatures validé en entretien technique avec aucune recruteur il n'affiche rien dans tout la requête et pas un (0 dans le count et vide dans le recruteur) .
    et le deuxième :
    2 -quand je supprime la partie bleu du regroupement en entretien technique (au dessus dans le code) , j'obtiens des résultat doublés , voici une capture d'ecran : Nom : Capture.PNG
Affichages : 141
Taille : 13,8 Ko
    la partie encadré est en boublans , et je vous remercie sincèrement de vos aide et de votre avance

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Ci-dessous quelques remarques importantes :

    1 - Le fait de lister les tables ou des requêtes séparées par des virgules est une techniques très anciennes, et fortement déconseillé. En effet, elle ne permet pas séparer les clauses qui relèvent de la jointure, des clause qui relèvent de la clause WHERE. en outre, lorsque la clause WHERE est omise, ce qui est votre cas, en ce qui concerne la requête globale SELECT * ( requete 1, requete 2, requete 3, requete 4, requete 5, requete 6), cela revient exactement à faire le produit cartésien (CROS JOIN) entre les 6 requêtes !

    2 - Il faut donc commencer par respecter la norme SQL lors de l'écriture des jointures (jointures internes, externes, produit cartésie etc.), et ce, en utilisant les opérateurs appropriés (INNER JOIN , LEFT OUTER JOIN, CROSS JOIN, etc.). Votre code sera ainsi plus propre et plus clair.

    3 - Pour que vous ayez une seule ligne de résultat final, il faut que chacune des 6 requêtes (requête 1 à requête 6) retourne une seule ligne sinon le CROSS JOIN implicite entre ces 6 requêtes aura pour effet de démultiplier les lignes et c'est exactement ce qui vous êtes arrivé lorsque vous avez supprimé le texte en bleu. (la requête 6 retourne plusieurs lignes et fini par démultiplier les lignes du résultat final, le CROSS JOIN opérant. Ce qui explique le constat que vous avez effectué (problème n° 2) :
    quand je supprime la partie bleu du regroupement en entretien technique (au dessus dans le code) , j'obtiens des résultat doublés , voici une capture d'ecran.
    4 - Une jointure interne entre un ensemble A et un ensemble "Vide" donne par essence comme résultat un ensemble "Vide". Ce qui explique votre constat (Problème n° 1) :
    quand je veux regrouper avec le recruteur dans l'entretien technique (mentionné en bleu au dessus dans le code) ,et si il ne trouve aucune candidatures validé en entretien technique avec aucune recruteur il n'affiche rien dans tout la requête et pas un (0 dans le count et vide dans le recruteur).
    Conclusion :
    Je ne vous apporte pas la solution à votre problème. Je vous explique juste ce qui vous arrive ! et c'est déjà un début.

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/11/2014, 16h00
  2. Problème avec une requête Select
    Par Dev2810 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/12/2013, 16h02
  3. Incompatibilité de type avec une requête Select
    Par desilo dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 04/04/2008, 17h45
  4. [SQL 2005] Problème pour une requête SELECT
    Par Rodie dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/06/2007, 17h12
  5. Remplir une zone de liste Excel avec une requête Access (problème)
    Par Tontorise dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 30/05/2007, 14h26

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