Requete SQL probleme

benSQL -  
jee pee Messages postés 31982 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 31982 Date d'inscription   Statut Modérateur Dernière intervention   10 015
     
    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 31982 Date d'inscription   Statut Modérateur Dernière intervention   10 015
       
      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 31982 Date d'inscription   Statut Modérateur Dernière intervention   10 015
       
      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 31982 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 31982 Date d'inscription   Statut Modérateur Dernière intervention   10 015
       
      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 31982 Date d'inscription   Statut Modérateur Dernière intervention   10 015 > benSQL
         
        A toi de l'écrire, tout est dans mon dernier exemple ;-)
        0