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 :

Plusieurs requetes en une seule - Jointure


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut Plusieurs requetes en une seule - Jointure
    Bonjour,
    Je galère depuis longtemps avec une requête qui me fait douter sur le fait qu'elle soit faisable.
    J'ai trois tables :
    Table1, Table2 et Table3
    Agence(id_agence, libelle_agence, id_Agence_Regionale)
    Salarie(id_salarie,nbSalarie, id_agence)
    Salaire(id_salaire, sal, etat, id_salarie)
    Je veux avoir, à la fin, une vue qui pour une agence régionale en entrée, affiche
    en un seul tableau des lignes des champs suivants
    (libelle_agence, sum(nbSalalarie), sum(Sal), sum(nbSalalarie), sum(Sal), sum(nbSalalarie), sum(Sal), Total_nb_Salarie, Total_Sal pour chacun des états etat1, etat2 et etat3 :

    ------------------------etat=etat1------------------etat=etat2------------------etat=etat3
    libelle_agence | sum(nbSalalarie) | sum(Sal) | sum(nbSalalarie) | sum(Sal) | sum(nbSalalarie) | sum(Sal) | Total_nb_Salarie | Total_Sal

    J'attends vos remarques et réponses.
    Merci.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il y a quelques sujets similaires en recherchant sur PIVOT.
    Voici avec des jointures fortes, vous pouvez adapter avec des jointures externes si vous voulez voir des agences qui n'auraient pas de salariés.
    J'ai supposé que vous n'avez que trois états :
    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
    select
        ag.libelle_agence,
        sum(case si.etat when 'etat1' then se.nbSalarie else 0 end) as nbSalarie_e1,
        sum(case si.etat when 'etat1' then si.Sal else 0 end) as Sal_e1,
        sum(case si.etat when 'etat2' then se.nbSalarie else 0 end) as nbSalarie_e2,
        sum(case si.etat when 'etat2' then si.Sal else 0 end) as Sal_e2,
        sum(case si.etat when 'etat3' then se.nbSalarie else 0 end) as nbSalarie_e3,
        sum(case si.etat when 'etat3' then si.Sal else 0 end) as Sal_e3,
        sum(se.nbSalarie) as Total_nbSalarie,
        sum(si.Sal) as Total_Sal
    from
        Agence ag
        inner join Salarie se
          on se.id_agence = ag.id_agence
        inner join Salaire si
          on si.id_salarie = se.id_salarie
    group by
        ag.libelle_agence

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 215
    Points : 558
    Points
    558
    Par défaut
    Il me semble en principe possible de réaliser ce que tu veux, mais je ne pense pas que ce soit possible en une seule requête.
    [Edit] Je viens de voir la réponse de Waldar, arrivée pendant que j'écrivais mon message. Je suis bluffé...
    Je n'ai pas encore étudié les cases, mais par contre je sais qu'ils n'existent pas dans toutes les bases de données. Je maintiens donc ma réponse ci dessous au cas où sa solution ne serait pas applicable.[/edit]

    première étape :
    trois requêtes select into (avec union si possible), une par état, qui alimentent une table intermédiaire. Dans cette table, tu auras donc trois lignes pour chaque agence, avec les sum déjà calculés
    Je doute de la syntaxe exacte, alors je te laisse chercher un peu.

    deuxième étape :
    une autojointure triple , de la forme
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select 
      a.libelle_agence, 
      a.nbSalaries, a.totalSalaire,
      b.nbSalaries, b.totalSalaire,
      c.nbSalaries, c.totalSalaire,
      a.nbSalaries + b.nbSalaries + c.nbSalaries,
      a.totalSalaire + b.totalSalaire + c.totalSalaire
    from tableinter a, tableinter b, tableinter c
    where a.id_agence = b.id_agence and b.id_agence = c.id_agence
    and a.etat='etat1' and b.etat='etat2' and c.etat='etat3'

    Pas sûr que la solution soit optimale, mais elle devrait pouvoir être mise en place.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup,

    Je teste toute suite et je vous répond.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    D'abord je m'exuse pour une erreur que j'ai faite,
    En fait j'ai confondu la colonne nbSalarie par la colonne idSalarie. Car, je dois calculer combien y a t-il de salariés pour chaque etat.
    J'ai essayé de résoudre le problème en faisant un sum(idSalarie/idSalarie) et ça a l'air de marcher. Mais j'attends vos remarques en tout cas.

    En ce qui concerne la permière solution, effectivement elle me sort les 3 états en bonne forme mais érronés pour les deux derniers colonnes qui font le total de ces 3 états. Mais je pense que c'est du à ma faute dans l'énoncé du probleme.

    J'ai changé la jointure interne en externe et elle me sort tout.

    Mais les cases me posent un problème car il se peut que je passe sous Mysql au lieu de Oracle et je ne sais pas si ça marchera toujours.


    Pour la deusième solution, est ce que je dois créer la table en base ou bien c'est une table fictive?

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 215
    Points : 558
    Points
    558
    Par défaut
    Une table intermédiaire doit être en base...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Merci, je vais l'essayer toute suite.

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je reviendrai vers vous plus tard, mais ne soyez pas effrayé par les case.
    D'après ce que j'ai pu lire sur ce forum, ça fonctionne avec Oracle, SQL Server, DB2, Sybase, MySQL, Postgres.

    C'est la syntaxe normative depuis SQL:1992 il me semble.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Citation Envoyé par developp001 Voir le message
    D'abord je m'exuse pour une erreur que j'ai faite,
    En fait j'ai confondu la colonne nbSalarie par la colonne idSalarie. Car, je dois calculer combien y a t-il de salariés pour chaque etat.
    J'ai essayé de résoudre le problème en faisant un sum(idSalarie/idSalarie) et ça a l'air de marcher. Mais j'attends vos remarques en tout cas.
    Remplacez le simplement par un count(idSalarie), ça devrait convenir, et ce sera un peu plus approprié

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Merci à vous tous pour votre aide,

    Je divise point par point,

    D'abord pour la solution de la table intermédiare, j'ai fait une requete qui ne me sort pas toutes les agences pour certains états.
    Voici le code utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT   ag.libelle_agence, sum(si.Sal), count(se.idSalarie ) 
    FROM   P_DELEGATION 
    LEFT OUTER JOIN Salarie se 
          ON se.id_agence = ag.id_agence
    LEFT OUTER JOIN Salaire si
          ON si.id_salarie = se.id_salarie 
    WHERE  ag.idAgenceRegionale=id1 and (si.etat=etat1 or si.etat is null)
    group by ag.libelle_agence

    Concernant la solution des cases
    C'est magnifique que ça soit pour tous ces SGBD

    J'ai seulement ce problème qui persiste. J'ai toujours des résultats erronés pour les deux dernieres colonnes qui font le total de ces 3 états.

    J'ai aussi changé le sum comme vous m'avez dit Snipah par un count en changeant la valeur du Else du case de 0 à null.

    J'attends vos remarques.

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Que voulez-vous obtenir dans les colonnes total, vous ne l'avez pas précisé ?

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Je pouvais pas vous répondre avant.
    Merci beaucoup à vous tous pour votre aide.
    J'ai résolu le probleme des totaux. c'était pas compliqué.
    Je marque le sujet comme résolu.

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

Discussions similaires

  1. Plusieurs requetes en une seule ?
    Par lonyc dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/10/2008, 10h10
  2. Réponses: 6
    Dernier message: 23/02/2008, 11h17
  3. Réponses: 4
    Dernier message: 08/06/2006, 20h06
  4. [Access][Mysql]plusieures requetes en une seule
    Par Gwenved dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/05/2006, 12h10

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