sikove
Messages postés90Date d'inscriptionlundi 17 mars 2008StatutMembreDernière intervention31 mars 2010
-
25 mai 2008 à 12:41
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 2016
-
27 mai 2008 à 13:36
salut tout le monde,
je suis vraiment coincé avec cette requete :
- afficher le nom, salaire, departement et le salaire moyen du departement, pour tout les employés qui ont un salaire moyen>= sal moyen de leurs departements
ce que j'ai essayé de faire :
select avg(sal)
from emp as e
group by job
having avg(sal)>=all(select avg(sal)
from emp as r
group by depn)
and e.depn=(select depn
from emp as r
where e.depn=r.depn)
mais ça donne des erreurs, et en plus impossible d'ajouter le nom des employés dans la premiere selection ...
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 25 mai 2008 à 18:54
Salut,
il ne faut pas imbriquer les group by !
Il faut passer par une sous-requete de référence ,
Voici le test en Transact-SQL (sql-server) :
-- Exemple de table avec quelques données
declare @employe table(nom varchar(35), dept varchar(10), salaire money)
insert into @employe values('nom1', '13', 1000)
insert into @employe values('nom2', '13', 1500)
insert into @employe values('nom3', '27', 2000)
insert into @employe values('nom4', '10', 1200)
insert into @employe values('nom5', '75', 900)
insert into @employe values('nom6', '75', 2500)
-- Requete avec une reference à une sous-requete (appelée ref)
select
t1.nom as 'NOM',
t1.salaire as 'SALAIRE',
ref.dept as 'DEPT',
ref.avgSalaire as 'SALAIRE MOYEN DU DEPT'
from
@employe t1,
(select t2.dept,
avg(t2.salaire) as 'avgSalaire'
from @employe t2
group by t2.dept) as ref
where
t1.dept = ref.dept
and t1.salaire >= ref.avgSalaire
order by t1.dept
sikove
Messages postés90Date d'inscriptionlundi 17 mars 2008StatutMembreDernière intervention31 mars 2010 25 mai 2008 à 22:06
ah ok je savais pas qu'on pouvait faire ce truc ^^
j'ai d'autres requetes auquel je n'ai pas trouvé la réponse :
- obliger la majuscule, et doit contenir au moins 2 caratéres (nom char)
- la premiere caractere s'elle est renseigné, doit etre comprios entre a et z (titre char)
- sexe s'il est renseigné, ne doit accepter que les valeurs m et f (sexe char)
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 26 mai 2008 à 20:35
Rebonjour,
Ben va falloir commencer à bosser un peu non ?
Bon voilà pour tes problèmes :
-- la fonction upper pour les majuscules, la fonction len pour la taille d'une chaine :
-- et un pattern like pour avoir la première lettre entre a et z
selectupper(nom), titre from @employe
wherelen(nom) >= 2
and titre like'[a-z]%'
-- Concernant la contrainte sur le sexe
-- voilà la solution facile et plutot bète car elle rejette tous les champs qui n'ont pas les caracteres m ou f
and sexein('m', 'f')
-- voilà une solution plutot technique :
--Création d' une règle de base de donnée liée à la colonne voulue.
USE master
CREATE RULE rule_sexe
AS
@valeursin('m', 'f') or @valeur is null
EXEC
sp_bindrule 'rule_sexe' , 'employe.sexe'
-- A chaque INSERT dans la colonne sexe, la contrainte s'active