begin process at 2008 08 22 01:03:32
1 229 733 membres
5 nouveaux aujourd'hui
14 267 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : comment résoudre cette requete ? [ SQL Server, MSDE, SQL Express / Débutant(s) ] (sikove)

comment résoudre cette requete ? le 25/05/2008 12:41:08

sikove
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 ...

une idée svp ?

merci


Re : comment résoudre cette requete ? le 25/05/2008 18:54:07

yann_lo_san

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

-- Le résultat est :

NOM   SALAIRE    DEPT   SALAIRE MOYEN DU DEPT
-----------------------------------------------------------------
nom4     1200.0000   10       1200.0000
nom2     1500.0000   13       1250.0000
nom3     2000.0000   27       2000.0000
nom6     2500.0000   75       1700.0000

 


Re : comment résoudre cette requete ? le 25/05/2008 22:06:59

sikove
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)

tu pourrais m'aider stp ?

merci




Re : comment résoudre cette requete ? le 26/05/2008 20:35:08

yann_lo_san

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


Re : comment résoudre cette requete ? le 26/05/2008 22:52:41

sikove
merci, y'a des trucs que je savais pas ^^

enfaite dans la question 1 c'etait en realité une constrainte à faire : il faut obliger que le champ soit majuscule, j'ai essayé ça

constraint test check( (upper(champ)=champ))

mais cela n'a rien donné.... tu sais comment faire stp ?

merci encore



Re : comment résoudre cette requete ? le 27/05/2008 13:36:18

yann_lo_san

Salut,

Je peux t'aider même si cela est assez facile à déduire :

Les chaine non unicode (varchar) sont des suites de nombres (ASCII),
le a est different du A dans la suite ascii.

On en déduit donc ceci :

create table bidule
(
   c1 varchar(35)check(ascii(c1)=ascii(upper(c1)))
);



Classé sous : moyen, requete, salaire, sal, depn

Participer à cet échange

Pub



Appels d'offres

Snippets en rapport

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS