OVH Cloud OVH Cloud

question avec union

17 réponses
Avatar
jeorme
Bonjour à tous

Question pour les pro de SQL:

J'ai 50 élèves avec leur moyenne, je veux une requete dans laquelle j'ai les
10 meilleurs et les dix plus mauvais.

Ex:

select top 10 nom, moyenne
from notes
order by moyenne desc



select top 10 nom, moyenne
from notes
order by moyenne

Si je m'ai une union ça foire à cause des order by.

Que faire ?

7 réponses

1 2
Avatar
Laurent MOREAU
Sisi, on peut,
dans le doute j'ai fait un essai:

SELECT * FROM (select top 10 * from latable order by rang asc) a
union all
SELECT * FROM (select top 10 * from latable order by rang desc) b
order by 2

et ça marche

Laurent.




"jeorme" wrote in message
news:#
désolé mais ça marche pas on ne peut pas mettre de order by dans un select
d'un select
"bruno reiter [MVP]" <remove.this! a écrit dans le


message
de news:
> select A.au_id, A.au_lname, 'prems'
> from
> (
> select top 10 * from authors
> order by au_lname
> ) as a
> union all
> select A.au_id, A.au_lname,'derch'
> from
> (
> select top 10 * from authors
> order by au_lname desc
> ) as a
> order by 2
>
> br
>
> "jeorme" wrote in message
> news:
> > Bonjour à tous
> >
> > Question pour les pro de SQL:
> >
> > J'ai 50 élèves avec leur moyenne, je veux une requete dans laquelle


j'ai
> les
> > 10 meilleurs et les dix plus mauvais.
> >
> > Ex:
> >
> > select top 10 nom, moyenne
> > from notes
> > order by moyenne desc
> >
> >
> >
> > select top 10 nom, moyenne
> > from notes
> > order by moyenne
> >
> > Si je m'ai une union ça foire à cause des order by.
> >
> > Que faire ?
> >
> >
>
>




Avatar
bruno reiter [MVP]
Si je n'avais pas testé, j'aurais dit : je n'ai pas essayé!!!

et toi tu as testé? quelle version?

br

"jeorme" wrote in message
news:#
désolé mais ça marche pas on ne peut pas mettre de order by dans un select
d'un select
"bruno reiter [MVP]" <remove.this! a écrit dans le


message
de news:
> select A.au_id, A.au_lname, 'prems'
> from
> (
> select top 10 * from authors
> order by au_lname
> ) as a
> union all
> select A.au_id, A.au_lname,'derch'
> from
> (
> select top 10 * from authors
> order by au_lname desc
> ) as a
> order by 2
>
> br
>
> "jeorme" wrote in message
> news:
> > Bonjour à tous
> >
> > Question pour les pro de SQL:
> >
> > J'ai 50 élèves avec leur moyenne, je veux une requete dans laquelle


j'ai
> les
> > 10 meilleurs et les dix plus mauvais.
> >
> > Ex:
> >
> > select top 10 nom, moyenne
> > from notes
> > order by moyenne desc
> >
> >
> >
> > select top 10 nom, moyenne
> > from notes
> > order by moyenne
> >
> > Si je m'ai une union ça foire à cause des order by.
> >
> > Que faire ?
> >
> >
>
>




Avatar
Fred BROUARD
Voici la requête sans sous requêtes dans la clause from, sans clause TOP et sans
table temporaire :

CREATE TABLE NOTES (nom VARCHAR(8), moyenne FLOAT)

INSERT INTO NOTES VALUES ('Paul', 20)
INSERT INTO NOTES VALUES ('Pierre', 15)
INSERT INTO NOTES VALUES ('Jean', 0)
INSERT INTO NOTES VALUES ('Jacques', 3)
INSERT INTO NOTES VALUES ('Patrick', 18)
INSERT INTO NOTES VALUES ('Peter', 18)
INSERT INTO NOTES VALUES ('John', 5)
INSERT INTO NOTES VALUES ('Julien', 2)


select N1.nom, N1.moyenne, 'MEILLEURS' AS CLASSEMENT,
(SELECT MIN(moyenne) FROM NOTES) - N1.moyenne AS TRI
from NOTES N1
LEFT OUTER JOIN NOTES N2
ON N1.moyenne <= N2.moyenne
AND N1.nom <> N2.nom
GROUP BY N1.nom, N1.moyenne
HAVING COUNT(N2.nom) < 3
UNION
select N1.nom, N1.moyenne, 'MOINS BON' AS CLASSEMENT,
ABS((SELECT MIN(moyenne) FROM NOTES) - N1.moyenne) AS TRI
from NOTES N1
LEFT OUTER JOIN NOTES N2
ON N1.moyenne >= N2.moyenne
AND N1.nom <> N2.nom
GROUP BY N1.nom, N1.moyenne
HAVING COUNT(N2.nom) < 3
ORDER BY TRI

je l'ai volontairement limitée à 3 : HAVING COUNT(N2.nom) < 3
pour voir si cela marchais. Vous devez l'adapter pour 10.

Il y a peu de problèmes que SQL ne puisse résoudre par une requête !

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************



jgabillaud a écrit:
100% d'accord avec toi, la requête ne fonctionne pas car il n'est pas
possible de faire appariatre la même colonne 2 fois dans l'order by.
De plus les meilleurs possèdent une moyenne élevée, pour obtebir les 10
meilleurs il faut trier les moyennes en ordre décroissant DESC, et pour les
plus mauvais il faut trier par ordre croissant



"Med Bouchenafa" a écrit :


Je ne pense que la solution de Fred puisse marcher
Sinon Jeorme n'aurait pas poser la question !!!
Comme l'a bien fait remarquer Evariste, l'ORDER BY porte sur l'ensemble du
jeu de résultat après le regroupement par Union
Le passage par une table temporaire est une solution tout à fait acceptable.
Ce que tu as proposé fonctionne aussi à condition de lui rajouter un ORDER
BY sur l'ensemble
Attention à la gestion des doublons (deux elèves ayant la même note)

--
Bien cordialement
Med Bouchenafa

"Philippe T [MS]" a écrit dans le message de
news: %

Bonjour,

Oui, cela marche aussi !!! :-)

Phil.
________________________________________________________
Philippe TROTIN http://blogs.msdn.com/ptrotin
Microsoft Services France http://www.microsoft.com/france

"Fred BROUARD" wrote in message
news:

select top 10 nom, moyenne, '1 : les meilleurs' AS NOTATION
from notes
UNION
select top 10 nom, moyenne, '2 : les plus mauvais'
from notes
order by NOTATION ASC, moyenne DESC

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

jeorme a écrit:

Bonjour à tous

Question pour les pro de SQL:

J'ai 50 élèves avec leur moyenne, je veux une requete dans laquelle
j'ai





les

10 meilleurs et les dix plus mauvais.

Ex:

select top 10 nom, moyenne
from notes
order by moyenne desc



select top 10 nom, moyenne
from notes
order by moyenne

Si je m'ai une union ça foire à cause des order by.

Que faire ?

















Avatar
Fred BROUARD
Voici la requête sans sous requêtes dans la clause from, sans clause TOP et sans
table temporaire :

CREATE TABLE NOTES (nom VARCHAR(8), moyenne FLOAT)

INSERT INTO NOTES VALUES ('Paul', 20)
INSERT INTO NOTES VALUES ('Pierre', 15)
INSERT INTO NOTES VALUES ('Jean', 0)
INSERT INTO NOTES VALUES ('Jacques', 3)
INSERT INTO NOTES VALUES ('Patrick', 18)
INSERT INTO NOTES VALUES ('Peter', 18)
INSERT INTO NOTES VALUES ('John', 5)
INSERT INTO NOTES VALUES ('Julien', 2)


select N1.nom, N1.moyenne, 'MEILLEURS' AS CLASSEMENT,
(SELECT MIN(moyenne) FROM NOTES) - N1.moyenne AS TRI
from NOTES N1
LEFT OUTER JOIN NOTES N2
ON N1.moyenne <= N2.moyenne
AND N1.nom <> N2.nom
GROUP BY N1.nom, N1.moyenne
HAVING COUNT(N2.nom) < 3
UNION
select N1.nom, N1.moyenne, 'MOINS BON' AS CLASSEMENT,
ABS((SELECT MIN(moyenne) FROM NOTES) - N1.moyenne) AS TRI
from NOTES N1
LEFT OUTER JOIN NOTES N2
ON N1.moyenne >= N2.moyenne
AND N1.nom <> N2.nom
GROUP BY N1.nom, N1.moyenne
HAVING COUNT(N2.nom) < 3
ORDER BY TRI

je l'ai volontairement limitée à 3 : HAVING COUNT(N2.nom) < 3
pour voir si cela marchais. Vous devez l'adapter pour 10.

Il y a peu de problèmes que SQL ne puisse résoudre par une requête !

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************



jgabillaud a écrit:
100% d'accord avec toi, la requête ne fonctionne pas car il n'est pas
possible de faire appariatre la même colonne 2 fois dans l'order by.
De plus les meilleurs possèdent une moyenne élevée, pour obtebir les 10
meilleurs il faut trier les moyennes en ordre décroissant DESC, et pour les
plus mauvais il faut trier par ordre croissant



"Med Bouchenafa" a écrit :


Je ne pense que la solution de Fred puisse marcher
Sinon Jeorme n'aurait pas poser la question !!!
Comme l'a bien fait remarquer Evariste, l'ORDER BY porte sur l'ensemble du
jeu de résultat après le regroupement par Union
Le passage par une table temporaire est une solution tout à fait acceptable.
Ce que tu as proposé fonctionne aussi à condition de lui rajouter un ORDER
BY sur l'ensemble
Attention à la gestion des doublons (deux elèves ayant la même note)

--
Bien cordialement
Med Bouchenafa

"Philippe T [MS]" a écrit dans le message de
news: %

Bonjour,

Oui, cela marche aussi !!! :-)

Phil.
________________________________________________________
Philippe TROTIN http://blogs.msdn.com/ptrotin
Microsoft Services France http://www.microsoft.com/france

"Fred BROUARD" wrote in message
news:

select top 10 nom, moyenne, '1 : les meilleurs' AS NOTATION
from notes
UNION
select top 10 nom, moyenne, '2 : les plus mauvais'
from notes
order by NOTATION ASC, moyenne DESC

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

jeorme a écrit:

Bonjour à tous

Question pour les pro de SQL:

J'ai 50 élèves avec leur moyenne, je veux une requete dans laquelle
j'ai





les

10 meilleurs et les dix plus mauvais.

Ex:

select top 10 nom, moyenne
from notes
order by moyenne desc



select top 10 nom, moyenne
from notes
order by moyenne

Si je m'ai une union ça foire à cause des order by.

Que faire ?

















Avatar
Philippe T [MS]
Bonjour,

Cela sera nettement plus simple sous SQL Server 2005 avec les fonctions de
ranking : RANK(), DENSE_RANK(), NTILE(n) !!!

Phil.
________________________________________________________
Philippe TROTIN http://blogs.msdn.com/ptrotin
Microsoft Services France http://www.microsoft.com/france

"jeorme" wrote in message
news:#
en fait comme il n'y que la solution des tables tempo qui permet de


classer
dans cette ordre , j'ai fait différement.

J'ai pris la solution de philippe qui me remonte les 10 meilleurs et les


10
plus maivais dans n'importe quel ordre. J'envoie ça dans ma pages ASP un
tableau qu'on trie et j'affiche et ça roule.

Merci à tous pour votre aide.

PS: je pensais que ce problème serait simple à gérer par du sql mais comme
quoi !!!

"Med Bouchenafa" a écrit dans le message de news:
#
> Je ne pense que la solution de Fred puisse marcher
> Sinon Jeorme n'aurait pas poser la question !!!
> Comme l'a bien fait remarquer Evariste, l'ORDER BY porte sur l'ensemble


du
> jeu de résultat après le regroupement par Union
> Le passage par une table temporaire est une solution tout à fait
acceptable.
> Ce que tu as proposé fonctionne aussi à condition de lui rajouter un


ORDER
> BY sur l'ensemble
> Attention à la gestion des doublons (deux elèves ayant la même note)
>
> --
> Bien cordialement
> Med Bouchenafa
>
> "Philippe T [MS]" a écrit dans le message
de
> news: %
> > Bonjour,
> >
> > Oui, cela marche aussi !!! :-)
> >
> > Phil.
> > ________________________________________________________
> > Philippe TROTIN http://blogs.msdn.com/ptrotin
> > Microsoft Services France http://www.microsoft.com/france
> >
> > "Fred BROUARD" wrote in message
> > news:
> >> select top 10 nom, moyenne, '1 : les meilleurs' AS NOTATION
> >> from notes
> >> UNION
> >> select top 10 nom, moyenne, '2 : les plus mauvais'
> >> from notes
> >> order by NOTATION ASC, moyenne DESC
> >>
> >> A +
> >>
> >> --
> >> Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi,


web
> >> Livre SQL - col. Référence :


http://sqlpro.developpez.com/bookSQL.html
> >> Le site du SQL, pour débutants et pros :


http://sqlpro.developpez.com
> >> ************************ www.datasapiens.com


*************************
> >>
> >> jeorme a écrit:
> >> > Bonjour à tous
> >> >
> >> > Question pour les pro de SQL:
> >> >
> >> > J'ai 50 élèves avec leur moyenne, je veux une requete dans laquelle
> >> > j'ai
> > les
> >> > 10 meilleurs et les dix plus mauvais.
> >> >
> >> > Ex:
> >> >
> >> > select top 10 nom, moyenne
> >> > from notes
> >> > order by moyenne desc
> >> >
> >> >
> >> >
> >> > select top 10 nom, moyenne
> >> > from notes
> >> > order by moyenne
> >> >
> >> > Si je m'ai une union ça foire à cause des order by.
> >> >
> >> > Que faire ?
> >> >
> >> >
> >>
> >>
> >
> >
>
>




Avatar
jeorme
Bonjour bruno

oui j'ai testé il me sort à chaque fois une erreur sur le order. Je suis en
sql 7. Ca doit venir de ça . Il faut que je vois sous 2000

Merci .


"bruno reiter [MVP]" <remove.this! a écrit dans le message
de news:
Si je n'avais pas testé, j'aurais dit : je n'ai pas essayé!!!

et toi tu as testé? quelle version?

br

"jeorme" wrote in message
news:#
> désolé mais ça marche pas on ne peut pas mettre de order by dans un


select
> d'un select
> "bruno reiter [MVP]" <remove.this! a écrit dans le
message
> de news:
> > select A.au_id, A.au_lname, 'prems'
> > from
> > (
> > select top 10 * from authors
> > order by au_lname
> > ) as a
> > union all
> > select A.au_id, A.au_lname,'derch'
> > from
> > (
> > select top 10 * from authors
> > order by au_lname desc
> > ) as a
> > order by 2
> >
> > br
> >
> > "jeorme" wrote in message
> > news:
> > > Bonjour à tous
> > >
> > > Question pour les pro de SQL:
> > >
> > > J'ai 50 élèves avec leur moyenne, je veux une requete dans laquelle
j'ai
> > les
> > > 10 meilleurs et les dix plus mauvais.
> > >
> > > Ex:
> > >
> > > select top 10 nom, moyenne
> > > from notes
> > > order by moyenne desc
> > >
> > >
> > >
> > > select top 10 nom, moyenne
> > > from notes
> > > order by moyenne
> > >
> > > Si je m'ai une union ça foire à cause des order by.
> > >
> > > Que faire ?
> > >
> > >
> >
> >
>
>




Avatar
jeorme
Merci beaucoup Fred .

SQL est super qu'on le pige aussi bien.

"Fred BROUARD" a écrit dans le message de news:

Voici la requête sans sous requêtes dans la clause from, sans clause TOP


et sans
table temporaire :

CREATE TABLE NOTES (nom VARCHAR(8), moyenne FLOAT)

INSERT INTO NOTES VALUES ('Paul', 20)
INSERT INTO NOTES VALUES ('Pierre', 15)
INSERT INTO NOTES VALUES ('Jean', 0)
INSERT INTO NOTES VALUES ('Jacques', 3)
INSERT INTO NOTES VALUES ('Patrick', 18)
INSERT INTO NOTES VALUES ('Peter', 18)
INSERT INTO NOTES VALUES ('John', 5)
INSERT INTO NOTES VALUES ('Julien', 2)


select N1.nom, N1.moyenne, 'MEILLEURS' AS CLASSEMENT,
(SELECT MIN(moyenne) FROM NOTES) - N1.moyenne AS TRI
from NOTES N1
LEFT OUTER JOIN NOTES N2
ON N1.moyenne <= N2.moyenne
AND N1.nom <> N2.nom
GROUP BY N1.nom, N1.moyenne
HAVING COUNT(N2.nom) < 3
UNION
select N1.nom, N1.moyenne, 'MOINS BON' AS CLASSEMENT,
ABS((SELECT MIN(moyenne) FROM NOTES) - N1.moyenne) AS TRI
from NOTES N1
LEFT OUTER JOIN NOTES N2
ON N1.moyenne >= N2.moyenne
AND N1.nom <> N2.nom
GROUP BY N1.nom, N1.moyenne
HAVING COUNT(N2.nom) < 3
ORDER BY TRI

je l'ai volontairement limitée à 3 : HAVING COUNT(N2.nom) < 3
pour voir si cela marchais. Vous devez l'adapter pour 10.

Il y a peu de problèmes que SQL ne puisse résoudre par une requête !

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************



jgabillaud a écrit:
> 100% d'accord avec toi, la requête ne fonctionne pas car il n'est pas
> possible de faire appariatre la même colonne 2 fois dans l'order by.
> De plus les meilleurs possèdent une moyenne élevée, pour obtebir les 10
> meilleurs il faut trier les moyennes en ordre décroissant DESC, et pour


les
> plus mauvais il faut trier par ordre croissant
>
>
>
> "Med Bouchenafa" a écrit :
>
>
>>Je ne pense que la solution de Fred puisse marcher
>>Sinon Jeorme n'aurait pas poser la question !!!
>>Comme l'a bien fait remarquer Evariste, l'ORDER BY porte sur l'ensemble


du
>>jeu de résultat après le regroupement par Union
>>Le passage par une table temporaire est une solution tout à fait


acceptable.
>>Ce que tu as proposé fonctionne aussi à condition de lui rajouter un


ORDER
>>BY sur l'ensemble
>>Attention à la gestion des doublons (deux elèves ayant la même note)
>>
>>--
>>Bien cordialement
>>Med Bouchenafa
>>
>>"Philippe T [MS]" a écrit dans le message


de
>>news: %
>>
>>>Bonjour,
>>>
>>>Oui, cela marche aussi !!! :-)
>>>
>>>Phil.
>>>________________________________________________________
>>>Philippe TROTIN http://blogs.msdn.com/ptrotin
>>>Microsoft Services France http://www.microsoft.com/france
>>>
>>>"Fred BROUARD" wrote in message
>>>news:
>>>
>>>>select top 10 nom, moyenne, '1 : les meilleurs' AS NOTATION
>>>>from notes
>>>>UNION
>>>>select top 10 nom, moyenne, '2 : les plus mauvais'
>>>>from notes
>>>>order by NOTATION ASC, moyenne DESC
>>>>
>>>>A +
>>>>
>>>>--
>>>>Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
>>>>Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
>>>>Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
>>>>************************ www.datasapiens.com *************************
>>>>
>>>>jeorme a écrit:
>>>>
>>>>>Bonjour à tous
>>>>>
>>>>>Question pour les pro de SQL:
>>>>>
>>>>>J'ai 50 élèves avec leur moyenne, je veux une requete dans laquelle
>>>>>j'ai
>>>
>>>les
>>>
>>>>>10 meilleurs et les dix plus mauvais.
>>>>>
>>>>>Ex:
>>>>>
>>>>>select top 10 nom, moyenne
>>>>>from notes
>>>>>order by moyenne desc
>>>>>
>>>>>
>>>>>
>>>>>select top 10 nom, moyenne
>>>>>from notes
>>>>>order by moyenne
>>>>>
>>>>>Si je m'ai une union ça foire à cause des order by.
>>>>>
>>>>>Que faire ?
>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>>



1 2