Requete SQL probleme

benSQL -  
jee pee Messages postés 9439 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour ;

je dois effectuer une requete SQL : Afficher la liste des salarié (nom ; prenom; Nom du diplome ) qui ont un BAC et/ou un BTS (ne pas utiliser les codes diplomes D1 et D2 );

mes tables sont : salarie qui regroupe les noms prenoms des salarié , le matricule est egalement precisé ; les salarie ont tous 1 matricule ; une table avoir_diplome regroupe les champs matricule et code_diplome
et les code diplome D1 D2 D3 etc ; code diplome est dans une table Nomme Diplome qui regroupe code diplome , nom du diplome (et niveau ( pas utile ici )

jai donc fais ma requête : sous le format sql la voici :

SELECT SALARIE.NOM, SALARIE.PRENOM, DIPLOME.DIPLOME
FROM SALARIE INNER JOIN (DIPLOME INNER JOIN AVOIR_DIPLOME ON DIPLOME.CODE_DIPLOME = AVOIR_DIPLOME.CODE_DIPLOME) ON SALARIE.MATRICULE = AVOIR_DIPLOME.MATRICULE
WHERE (((DIPLOME.DIPLOME)="bac" Or (DIPLOME.DIPLOME)="bts"))
ORDER BY SALARIE.NOM;


cela fonctionne cepedant une salarie possede les deux , et apparait donc deux fois dans la reponse.

D'où ma question ensuite : je dois cree une autre requete : afficher la liste des salariés (nom,prenom qui ont un BAC ET un bTS ducoup elle rentre dans ce cadre cependant elle apparait deux fois ; quelqu 'un aurait t'il une solution ?

merci d'avances , Cordialement

2 réponses

  1. jee pee Messages postés 9439 Date d'inscription   Statut Modérateur Dernière intervention   9 977
     
    Bonjour,

    Tu fais un select juste nom, prénom et en fin tu ajoutes un
    group by 
    nom, prénom.
    having count(*) >1
    .

    0
    1. jee pee Messages postés 9439 Date d'inscription   Statut Modérateur Dernière intervention   9 977
       
      mais si le salarié a un bts couture et un bts mécanique, cela va donner une réponse fausse ;-)

      il faudrait alors séparer bac et bts et faire un jointure pour le bac et une autre jointure pour le bts
      0
    2. benSQL
       
      d'accord je dois donc enlever diplome du select ? , je ne suis pas sure de comprendre comment utiliser cela ,
      pas de complication de ce genre , le salarie a uniquement le bac et le bts
      0
    3. jee pee Messages postés 9439 Date d'inscription   Statut Modérateur Dernière intervention   9 977
       
      SELECT SALARIE.NOM, SALARIE.PRENOM
      FROM SALARIE INNER JOIN (DIPLOME INNER JOIN AVOIR_DIPLOME ON DIPLOME.CODE_DIPLOME = AVOIR_DIPLOME.CODE_DIPLOME) ON SALARIE.MATRICULE = AVOIR_DIPLOME.MATRICULE
      WHERE (((DIPLOME.DIPLOME)="bac" Or (DIPLOME.DIPLOME)="bts"))
      GROUP BY SALARIE.NOM, SALARIE.PRENOM HAVING COUNT(*) > 1;
      0
    4. benSQL > jee pee Messages postés 9439 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Mille fois merci !
      0
    5. benSQL > benSQL
       
      derniere question jai deux requête ou il met demander de proposer deux version différente pour arriver au meme resultat :

      - listes des salariés (nom,prenom,nom du service, salaire) qui sont affectés au services informatique et expeditions. Le resultat sera trieé par service ( la requete ne devra pas mentionner les codes 'EXP' et INF des services
      j'ai donc fait :

      SELECT SALARIE.NOM, SALARIE.PRENOM, SERVICE.NOM_SERVICE, SALARIE.SALAIRE
      FROM SERVICE INNER JOIN (EMPLOI INNER JOIN SALARIE ON EMPLOI.CODE = SALARIE.CODE_EMPLOI) ON SERVICE.CODE_SERV = SALARIE.CODE_SERVICE
      WHERE (((SALARIE.CODE_SERVICE)='EXP' Or (SALARIE.CODE_SERVICE)='INF'))
      ORDER BY SERVICE.NOM_SERVICE;


      si jamais tu connais une alternative pour obtenir un resultat similaire

      pareil pour celle ci : - liste des salariés (nom,prenom,nom du service , salaire ) qui sont affecter au services commercial et expeditions et qui percoit superieur a 2000 euros . le resultat sera trier par service , la requete ne devra pas mentionner le code 'EXP' et 'COM' des services

      j'ai fais cela :

      SELECT SALARIE.NOM, SALARIE.PRENOM, SERVICE.NOM_SERVICE, SALARIE.SALAIRE
      FROM SERVICE INNER JOIN SALARIE ON SERVICE.CODE_SERV = SALARIE.CODE_SERVICE
      WHERE (((SALARIE.CODE_SERVICE)='EXP' Or (SALARIE.CODE_SERVICE)='COM'))
      ORDER BY SALARIE.CODE_SERVICE;



      merci d'avance
      0
  2. benSQL
     
    effectivement il me semble que cela fonctionne ; avez vous une deuxieme methode pour celle ci ?

    SELECT SALARIE.NOM, SALARIE.PRENOM, SERVICE.NOM_SERVICE, SALARIE.SALAIRE
    FROM SERVICE INNER JOIN SALARIE ON SERVICE.CODE_SERV = SALARIE.CODE_SERVICE
    WHERE (((SERVICE.NOM_SERVICE)='Expéditions' Or (SERVICE.NOM_SERVICE)='Commercial') AND ((SALARIE.SALAIRE)>2000));
    0
    1. jee pee Messages postés 9439 Date d'inscription   Statut Modérateur Dernière intervention   9 977
       
      Facile moi qui ne pratique pas l'INNER JOIN ou l'OUTER JOIN

      SELECT SALARIE.NOM, SALARIE.PRENOM, SERVICE.NOM_SERVICE, SALARIE.SALAIRE
      FROM SALARIE, SERVICE 
      WHERE SERVICE.CODE_SERV = SALARIE.CODE_SERVICE 
      AND SERVICE.NOM_SERVICE IN ('Expéditions','Commercial')
      AND SALARIE.SALAIRE > 2000;
      0
    2. benSQL
       
      parfait effectivement ; je vous remercie sincerement ;

      et pour celle ci avez vous une alternative ?

      SELECT SALARIE.NOM, SALARIE.PRENOM, SERVICE.NOM_SERVICE, SALARIE.SALAIRE
      FROM SERVICE INNER JOIN (EMPLOI INNER JOIN SALARIE ON EMPLOI.CODE = SALARIE.CODE_EMPLOI) ON SERVICE.CODE_SERV = SALARIE.CODE_SERVICE
      WHERE (((SERVICE.NOM_SERVICE)="Expéditions" Or (SERVICE.NOM_SERVICE)='Informatique'))
      ORDER BY SERVICE.NOM_SERVICE;
      0
      1. jee pee Messages postés 9439 Date d'inscription   Statut Modérateur Dernière intervention   9 977 > benSQL
         
        A toi de l'écrire, tout est dans mon dernier exemple ;-)
        0