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 :

Aide pour une requête


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Aide pour une requête
    Bonjour à tous,

    J'essaie actuellement de faire une requête, mais mes connaissances en SQL étant assez limitées, je galère un peu. Si vous pouviez m'aider ça serait vraiment sympa

    Je souhaiterais obtenir le nombre de statut qu'ont mes employés en fonction du lieu où ils se trouvent.
    Je m'explique : Un employé peut être affecté à Paris avec un statut "SIE". Un autre employé, peut lui aussi être affecté à Paris, mais avec un statut "LOC" par exemple.

    Ce que je veux donc savoir, c'est le nombre de chaque statut, regroupé par ville.

    Voici un shema de mes tables, avec en dessous le resultat attendu :



    Voici la requête que j'ai essayé de faire, mais le comptage n'est pas bon car j'ai le même nombre partout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT communes.id_commune, libelle_commune, id_pays, libelle_pays
    COUNT( CASE WHEN employes.statut = "LOC" THEN 1 ELSE null END) AS Locaux,
    COUNT(CASE WHEN employes.statut = "EXP" THEN 1 ELSE null END) AS Expatriés,
    COUNT(CASE WHEN employes.statut = "SIE" THEN 1 ELSE null END) AS Siège,
    COUNT(CASE WHEN employes.statut = "nc" THEN 1 ELSE null END) AS NC
    FROM communes, secteurs, pays, employes
    LEFT JOIN pays ON pays.id_pays = communes.id_pays
    LEFT JOIN communes ON communes.id_commune = employes.id_commune 
    group by  libelle_pays, libelle_commune
    Merci d'avance pour votre aide

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Dans votre FROM c'est plutôt le grand bazar, ça m'étonne même que la syntaxe passe puisque vous utilisez plusieurs fois les mêmes tables sans les aliaser.

    Vos jointures externes ne me semblent pas nécessaires non plus.

    Quand on compare une colonne à une constante littérale, on utilise des simples quotes.

    Votre group by ne reflète pas les données non-agrégées de votre select.

    Voila quelques axes d'amélioration

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci pour votre aide, j'ai bien essayé d'épurer mon from ainsi que mes jointures, mais je n'arrive toujours pas à avoir le résultat que je veux

    J'ai essayé avec une requête imbriquée, mais ça ne fonctionne pas non plus

    Need help

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Le problème principal de cette requête est peut-être qu'il faudrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SUM( CASE WHEN employes.statut = 'LOC' THEN 1 ELSE 0 END) AS Locaux,
    ...etc...
    au lieu de la clause COUNT() actuelle

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    J'ai essayé mais malheuresement cela ne fonctionne toujours pas

    En fait, si je met juste la requete de comptage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT SUM(CASE WHEN D.statut = "LOC" THEN 1 ELSE 0 END) AS Locaux,
        SUM(CASE WHEN D.statut = 'EXP' THEN 1 ELSE 0 END) AS Expatriés,
        SUM(CASE WHEN D.statut = 'SIE' THEN 1 ELSE 0 END) AS Siège,
        SUM(CASE WHEN D.statut = 'nc' THEN 1 ELSE 0 END) AS NC
        FROM employes D
    Cela fonctionne, et il me compte bien les statut correctement.

    Mais dès que j'essaie d'inclure les libelles communes et pays par exemple, mon comptage devient faux, et j'obtiens plusieurs fois le même chiffre par exemple...

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par adrienbcn Voir le message
    Mais dès que j'essaie d'inclure les libelles communes et pays par exemple, mon comptage devient faux, et j'obtiens plusieurs fois le même chiffre par exemple...
    Il faudrait reposter la version actuelle de la requête complète.

  7. #7
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    A confirmer (car un peu simplifiée), mais cela à l'air de fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     SELECT d.id_employe, d.id_commune, e.libelle_commune, SUM(CASE WHEN D.statut = "LOC" THEN 1 ELSE 0 END) AS Locaux,
        SUM(CASE WHEN D.statut = 'EXP' THEN 1 ELSE 0 END) AS Expatriés,
        SUM(CASE WHEN D.statut = 'SIE' THEN 1 ELSE 0 END) AS Siège,
        SUM(CASE WHEN D.statut = 'nc' THEN 1 ELSE 0 END) AS NC
        FROM employes D, communes E
        WHERE d.id_commune = e.id_commune
        group by d.id_employe, d.id_commune

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    A mon avis le regroupement par id d'employé n'a pas lieu d'être, et en tout cas ça ne correspond pas à la question initiale.

  9. #9
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    En fait, j'ai oublié d'apporter une precision essentielle :

    La table employé est une table d'historique : A chaque fois qu'un employé se rend dans un pays, on ajoute la reférence à la table employé.

    Donc, il peut y avoir plusieurs fois le meme id_employe dans la table.

    C'est pour cela que je fais un group by id_employe

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Le problème principal de cette requête est peut-être qu'il faudrait faire SUM () au lieu de la clause COUNT() actuelle
    Ça revient exactement à la même chose !

    Si vous faites un group by id_employe, vous n'avez plus le résultat demandé, vous avez le résultat par ville / par employé.

    Il faut aussi normaliser votre syntaxe, utilisez des alias "parlant", et borner aux status sur lesquels vous requêtez (si ce sont tous vos status, vous pouvez effectivement vous passez du where) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      select co.libelle_commune,
             sum(case em.statut when 'LOC' then 1 else 0 end) as locaux,
             sum(case em.statut when 'EXP' then 1 else 0 end) as expatriés,
             sum(case em.statut when 'SIE' then 1 else 0 end) as siège,
             sum(case em.statut when 'nc'  then 1 else 0 end) as nc
        from employes em
             inner join communes co
               on co.id_commune = em.id_commune
       where em.statut in ('LOC', 'EXP', 'SIE', 'nc')
    group by co.libelle_commune;

  11. #11
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    essaye ça

    Code sql : 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
    SELECT A.nc, B.loc, C.sie, pays.libelle_pays, communes.libelle
    FROM (((communes INNER JOIN pays ON communes.id_pays = pays.id_pays) LEFT JOIN 
     
    (SELECT communes.id_commune, Count(employes.status) AS nc
    FROM communes, employes
    WHERE communes.id_commune=employes.id_commune And employes.status="nc"
    GROUP BY communes.id_commune, employes.status
    ) AS A ON communes.id_commune = A.id_commune) LEFT JOIN
     
    (SELECT communes.id_commune, Count(employes.status) AS loc
    FROM communes, employes
    WHERE communes.id_commune=employes.id_commune And employes.status="loc"
    GROUP BY communes.id_commune, employes.status
    ) AS B ON communes.id_commune = B.id_commune) LEFT JOIN 
     
    (SELECT communes.id_commune, Count(employes.status) AS sie
    FROM communes, employes
    WHERE communes.id_commune=employes.id_commune And employes.status="sie"
    GROUP BY communes.id_commune, employes.status
    ) AS C ON communes.id_commune = C.id_commune;

Discussions similaires

  1. Aide pour une requête et left join
    Par Lolo19 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 26/08/2005, 08h09
  2. J'ai besoin de votre aide pour une requête
    Par ovdz dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/05/2005, 11h42
  3. Demande d'aide pour une requête
    Par arkzor dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/12/2004, 02h40
  4. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

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