Je veux afficher la liste des employés (MAT,NOM) qui ont travaillé au moins dans deux services
Je veux afficher la liste des employés (MAT,NOM) qui ont travaillé au moins dans deux services
C'est pas forcément le plus optimiser ni le plus propre, mais ca devrait fonctionner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 select MAT, NOM from EMPLOYE where exists ( select 1 from AFFECTATION AFF1 inner join AFFECTATION AFF2 on AFF1.MAT# = AFF2.MAT# and AFF1.CODE_SER# <> AFF2.CODE_SER# where AFF1.MAT# = MAT ) ;
Bonjour,
Ca sent tout de même une demande de solution pour un exercice...
Et si tu nous montrait plutôt ce que tu as tenté de faire, histoire qu'on te donne des pistes à creuser ?
Le but d'un forum comme celui-ci n'est pas de faire les devoirs des autres, il me semble...
Tatayo.
Je suis d'accord avec toi, mais ca ne me pose pas particulièrement de problème d'éthique lol ^^
dès lors que ca m'amuse d'écrire une minuscule requête, ca me gène pas de le faire.
Après, l'auteur s'arrange avec sa conscience, et surtout, s'arrange avec ses futures compétences professionnelles.
Mais la prochaine fois, je penserai à balancer un easter egg dans les requêtes que je ponds, c'est une bonne idée pour voir si la personne comprend qlq chose ou si elle recopie betement.
Bonjour,
@bstevy ta solution est de mon point de vue "surprenante"
ayant été prof dans un passé lointain, ce devoir m'aurait mis la puce à l'oreille et j'aurais senti la "triche"
une solution à base de GROUP BY/HAVING mâtinée d'une petite jointure m'aurait suffit je pense
j'aimerais bien voir ça
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
Bonjour ,
Merci pour vos réponses , en effet mon prof nous a envoyé la correction mais j'ai pas compris son raisonnement donc j'ai voulu voir d'autres version pour faire une comparaison afin de comprendre . Enfin je vous montre la correction dans la figure ci-dessous ,
et voila mon essai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Select Mat, Nom From employe , affectation where employe.Mat = affectation.Mat Having ( count(*) from affectation > 2 )
Tu diras à ton prof de notre part que depuis le siècle dernier les jointures s'écrivent en utilisant l'opérateur JOIN.
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
Si tu as essayé de l'exécuter avec un SGBD, tu sais déjà qu'elle est incorrecte.
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
Où est la clause GROUP BY ?
et bien sur j'abonde dans le sens de al1_24 un JOIN bien écrit serait un plus
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
Je n'avais pas fait attention mais la clause GROUP BY est aussi absente de la correction
Rassure-moi : ce n'est pas une formation diplômante, avec des examens reconnus, que tu suis ?
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
Si , mais le prof a pris son diplôme l'année dernière
bonjour,
ne s'exprime pas Having count(*) from affectation > 2 mais HAVING count(*) >= 2qui ont travaillé au moins dans deux services
on peut aussi lire "au moins dans deux services" par "plus d'un service" donc HAVING count(*)>1
clôturons cette discussion par une solution partielle
Obtenir le nombre d'affectation par matricule
Obtenir les matricules ayant travaillé dans au moins 2 services
Code : Sélectionner tout - Visualiser dans une fenêtre à part 1. SELECT MAT,count(*) FROM AFFECTATION GROUP BY MAT
Obtenir le nom d'un matricule
Code : Sélectionner tout - Visualiser dans une fenêtre à part 2. SELECT MAT FROM AFFECTATION GROUP BY MAT HAVING COUNT(*)>1
Combinons 2 et 3 , plusieurs solutions possibles, les plus élégantes à mon avis seraient celle-ci
Code : Sélectionner tout - Visualiser dans une fenêtre à part 3. SELECT A.MAT,E. NOM FROM AFFECTATION A INNER JOIN EMPLOYE E ON A.MAT=E.MAT
Notez que pour des raisons pratiques j'utilise des noms d'alias pour les tables
que j'ai mis la table AFFECTATION en premier dans la jointure parce que le "travail" se fait principalement sur cette dernière
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT A.MAT AS Merci,E.NOM AS developpez ,count(*) AS net FROM AFFECTATION INNER JOIN EMPLOYE E ON A.MAT=E.MAT // expression de Jointure GROUP BY MAT,NOM // expression de groupage HAVING COUNT(*) >1 // sélection de résultat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 // en utilisant une sous-requête telle que défini dans la norme SQL-99 WITH T AS (SELECT MAT,COUNT(*) AS N FROM AFFECTATION GROUP BY MAT) // obtenir le nombre d''affectations par matricule 1 SELECT T.MAT AS Merci,E.NOM as developpez,T.N AS net FROM T INNER JOIN EMPLOYE E ON t.MAT=E.MAT // faire la jointure 2 WHERE T.N>1 // au moins 2 , c.a.d plus d'une affectation
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager