Discussion:
Sql Union (Sql Server)
(trop ancien pour répondre)
OlivierH
2010-05-18 15:09:25 UTC
Permalink
Bonjour à tous,

Avez vous une astuce pour avoir deux order différent dans un UNION,
j'ai besoin en sql serveur de lancer en une requête comme celle ci.
(cette requete ne fonctionne pas car il doit avoir qu'un seul order by à
la fin)

SELECT publicite.*, agences.ag_enseigne
FROM publicite
LEFT JOIN agences ON publicite.ag_codeagence=agences.ag_codeagence
Where pub_naturebien='MAISON'
ORDER BY pub_prix ASC
UNION
SELECT publicite.*, agences.ag_enseigne
FROM publicite
LEFT JOIN agences ON publicite.ag_codeagence=agences.ag_codeagence
Where pub_naturebien<>'MAISON'
ORDER BY pub_naturebien DESC, pub_nbpieces ASC, pub_prix ASC

J'ai besoin de recuperer 1 cursor, je ne peux pas en lancer deux afin de
les fusionner.

D'avance merci
Olivier,
Thierry
2010-05-18 15:48:59 UTC
Permalink
Bonjour,

Voici 2 solutions :)

N°1

;
WITH cte as
(
SELECT publicite.*, agences.ag_enseigne
, row_number() over ( order by pub_prix asc) as ordre
FROM ...

UNION
SELECT publicite.*, agences.ag_enseigne
, row_number() over (pub_naturebien DESC, pub_nbpieces ASC, pub_prix ASC) as
ordre
FROM ...

)
SELECT * FROM cte ORDER BY pub_naturebien, ordre


N° 2

;
WITH cte as
(
SELECT ...
UNION
SELECT ...
)
SELECT * FROM cte
ORDER BY
pub_naturebien,
CASE WHEN pub_naturebien='MAISON' THEN pub_prix END ASC,
CASE WHEN pub_naturebien<>'MAISON' THEN pub_naturebien END DESC,
CASE WHEN pub_naturebien<>'MAISON' THEN pub_nbpieces END ASC,
CASE WHEN pub_naturebien<>'MAISON' THEN pub_prix END ASC
--
Thierry
Post by OlivierH
Bonjour à tous,
Avez vous une astuce pour avoir deux order différent dans un UNION,
j'ai besoin en sql serveur de lancer en une requête comme celle ci.
(cette requete ne fonctionne pas car il doit avoir qu'un seul order by à
la fin)
SELECT publicite.*, agences.ag_enseigne
FROM publicite
LEFT JOIN agences ON publicite.ag_codeagence=agences.ag_codeagence
Where pub_naturebien='MAISON'
ORDER BY pub_prix ASC
UNION
SELECT publicite.*, agences.ag_enseigne
FROM publicite
LEFT JOIN agences ON publicite.ag_codeagence=agences.ag_codeagence
Where pub_naturebien<>'MAISON'
ORDER BY pub_naturebien DESC, pub_nbpieces ASC, pub_prix ASC
J'ai besoin de recuperer 1 cursor, je ne peux pas en lancer deux afin de
les fusionner.
D'avance merci
Olivier,
Thierry
2010-05-18 15:57:33 UTC
Permalink
Correctif : retirer le "pub_naturebien," juste après les ORDER BY
--
Thierry
Post by Thierry
Bonjour,
Voici 2 solutions :)
N°1
;
WITH cte as
(
SELECT publicite.*, agences.ag_enseigne
, row_number() over ( order by pub_prix asc) as ordre
FROM ...
UNION
SELECT publicite.*, agences.ag_enseigne
, row_number() over (pub_naturebien DESC, pub_nbpieces ASC, pub_prix ASC)
as ordre
FROM ...
)
SELECT * FROM cte ORDER BY pub_naturebien, ordre
N° 2
;
WITH cte as
(
SELECT ...
UNION
SELECT ...
)
SELECT * FROM cte
ORDER BY
pub_naturebien,
CASE WHEN pub_naturebien='MAISON' THEN pub_prix END ASC,
CASE WHEN pub_naturebien<>'MAISON' THEN pub_naturebien END DESC,
CASE WHEN pub_naturebien<>'MAISON' THEN pub_nbpieces END ASC,
CASE WHEN pub_naturebien<>'MAISON' THEN pub_prix END ASC
--
Thierry
Post by OlivierH
Bonjour à tous,
Avez vous une astuce pour avoir deux order différent dans un UNION,
j'ai besoin en sql serveur de lancer en une requête comme celle ci.
(cette requete ne fonctionne pas car il doit avoir qu'un seul order by à
la fin)
SELECT publicite.*, agences.ag_enseigne
FROM publicite
LEFT JOIN agences ON publicite.ag_codeagence=agences.ag_codeagence
Where pub_naturebien='MAISON'
ORDER BY pub_prix ASC
UNION
SELECT publicite.*, agences.ag_enseigne
FROM publicite
LEFT JOIN agences ON publicite.ag_codeagence=agences.ag_codeagence
Where pub_naturebien<>'MAISON'
ORDER BY pub_naturebien DESC, pub_nbpieces ASC, pub_prix ASC
J'ai besoin de recuperer 1 cursor, je ne peux pas en lancer deux afin de
les fusionner.
D'avance merci
Olivier,
OlivierH
2010-05-18 16:18:29 UTC
Permalink
Très Très fort thierry.

Le Over je ne connaissais même pas. Je teste et je te dit quoi ;-)

ps : tu développes toujours sur fox, ou tu as migré sur .net maintenant.

Olivier,
Post by Thierry
row_number() over ( order by pub_prix asc)
Thierry
2010-05-18 16:31:43 UTC
Permalink
Encore un peu de Fox.
Sinon, je développe surtout en T-SQL et je sous-traite à d'autres
développeurs, la partie interface utilisateur en Silverlight. (il faudra
bien que j'apprenne bientôt ce truc là)
--
Thierry
Post by OlivierH
Très Très fort thierry.
Le Over je ne connaissais même pas. Je teste et je te dit quoi ;-)
ps : tu développes toujours sur fox, ou tu as migré sur .net maintenant.
Olivier,
Post by Thierry
row_number() over ( order by pub_prix asc)
OlivierH
2010-05-18 16:50:23 UTC
Permalink
Thierry,

J'ai l'impression que tout le monde (enfin les foxeurs que je vois sur
le net uwe et venelina, craig boyd et bo durban et etc...)
partent vers Silverlight . Mais je lui trouve deux inconvénient vraiment
genant c'est qu'il n'est pas le même sur
les plates formes linux et mac. Et que la partie data centric est d'une
lourdeur .
Je compare ca à asp.net, déjà que l'on perd 40% de temps en plus par
rapport à fox, silverlight me fait
perdre encore plus de temps. As tu des astuces que je ne connais pas
coté rapatriement des données ?

A tres bientot
Olivier,
Post by Thierry
Encore un peu de Fox.
Sinon, je développe surtout en T-SQL et je sous-traite à d'autres
développeurs, la partie interface utilisateur en Silverlight. (il faudra
bien que j'apprenne bientôt ce truc là)
Thierry
2010-05-18 17:02:08 UTC
Permalink
Il y a RIA SERVICES pour faciliter tout ça, mais je ne développe pas encore
dessus.

Sinon, ça fonctionne sur Mac et Linux.
--
Thierry
Post by OlivierH
Thierry,
J'ai l'impression que tout le monde (enfin les foxeurs que je vois sur
le net uwe et venelina, craig boyd et bo durban et etc...)
partent vers Silverlight . Mais je lui trouve deux inconvénient vraiment
genant c'est qu'il n'est pas le même sur
les plates formes linux et mac. Et que la partie data centric est d'une
lourdeur .
Je compare ca à asp.net, déjà que l'on perd 40% de temps en plus par
rapport à fox, silverlight me fait
perdre encore plus de temps. As tu des astuces que je ne connais pas
coté rapatriement des données ?
A tres bientot
Olivier,
Post by Thierry
Encore un peu de Fox.
Sinon, je développe surtout en T-SQL et je sous-traite à d'autres
développeurs, la partie interface utilisateur en Silverlight. (il faudra
bien que j'apprenne bientôt ce truc là)
OlivierH
2010-05-18 17:12:16 UTC
Permalink
Ok il faut que je vois ria services.

Sur mac et linux ce n'est pas microsoft qui developpe donc le meme code
peut etre interpreté d'une facon
differente sur ces machines. Et en plus tu as 2 versions de retard,
bonjour les avancés.

@ bientot.

Olivier,
Post by Thierry
Il y a RIA SERVICES pour faciliter tout ça, mais je ne développe pas encore
dessus.
Sinon, ça fonctionne sur Mac et Linux.
OlivierH
2010-05-18 17:01:31 UTC
Permalink
Thierry

Encore un dernier point dans le union il n'accepte pas un champs de type
TEXT
"//Le type de données text ne peut pas être sélectionné en tant que
DISTINCT, car il n'est pas comparable.//"

As tu une idée de comment je peux l'utiliser ?

Olivier,
Post by Thierry
Correctif : retirer le "pub_naturebien," juste après les ORDER BY
OlivierH
2010-05-18 17:11:05 UTC
Permalink
Thierry

je m'en suis sorti avec un cast de varchar
Mais c'est embetant que l'on puisse à utiliser des champs de type text.

Olivier
Post by Thierry
Thierry
Encore un dernier point dans le union il n'accepte pas un champs de
type TEXT
"//Le type de données text ne peut pas être sélectionné en tant que
DISTINCT, car il n'est pas comparable.//"
As tu une idée de comment je peux l'utiliser ?
Olivier,
Post by Thierry
Correctif : retirer le "pub_naturebien," juste après les ORDER BY
Gregory Adam
2010-05-18 17:16:53 UTC
Permalink
Essaie

union ALL
--
Gregory
_
"OlivierH" <"nospam[contact]"@planitron.com> wrote in message news:%***@TK2MSFTNGP04.phx.gbl...
Thierry

Encore un dernier point dans le union il n'accepte pas un champs de type TEXT
"Le type de données text ne peut pas être sélectionné en tant que DISTINCT, car il n'est pas comparable."

As tu une idée de comment je peux l'utiliser ?

Olivier,


Le 18/05/2010 17:57, Thierry a écrit :
Correctif : retirer le "pub_naturebien," juste après les ORDER BY
OlivierH
2010-05-18 17:52:56 UTC
Permalink
Salut greg,

Ca fonctionne mais normalement unionall cela enlève uniquement les doublons,

peut être que le distinct disparait.

Olivier,
Post by Gregory Adam
Essaie
union ALL
--
Gregory
_
Thierry
Encore un dernier point dans le union il n'accepte pas un champs de type TEXT
"//Le type de données text ne peut pas être sélectionné en tant
que DISTINCT, car il n'est pas comparable.//"
As tu une idée de comment je peux l'utiliser ?
Olivier,
Post by Thierry
Correctif : retirer le "pub_naturebien," juste après les ORDER BY
OlivierH
2010-05-19 08:07:47 UTC
Permalink
Salut Greg,

Comme j'ai une clause where je peux utiliser union all , il faut attention
car dans d'autres requetes cela peut poser des problemes car le union
all accepte les doublons
de record.

Merci à toi

@+

Olivier,
Post by Gregory Adam
Essaie
union ALL
--
Gregory
_
Thierry
Encore un dernier point dans le union il n'accepte pas un champs de type TEXT
"//Le type de données text ne peut pas être sélectionné en tant
que DISTINCT, car il n'est pas comparable.//"
As tu une idée de comment je peux l'utiliser ?
Olivier,
Post by Thierry
Correctif : retirer le "pub_naturebien," juste après les ORDER BY
Gregory Adam
2010-05-19 08:18:50 UTC
Permalink
Olivier,

Je fais toujours union all - c'est plus rapide

Maintenant, je fais attention d'eviter les doublons
--
Gregory
_
"OlivierH" <"nospam[contact]"@planitron.com> wrote in message news:%23e$***@TK2MSFTNGP05.phx.gbl...
Salut Greg,

Comme j'ai une clause where je peux utiliser union all , il faut attention
car dans d'autres requetes cela peut poser des problemes car le union all accepte les doublons
de record.

Merci à toi

@+

Olivier,


Le 18/05/2010 19:16, Gregory Adam a écrit :
Essaie

union ALL

--
Gregory
_
"OlivierH" <"nospam[contact]"@planitron.com> wrote in message news:%***@TK2MSFTNGP04.phx.gbl...
Thierry

Encore un dernier point dans le union il n'accepte pas un champs de type TEXT
"Le type de données text ne peut pas être sélectionné en tant que DISTINCT, car il n'est pas comparable."

As tu une idée de comment je peux l'utiliser ?

Olivier,


Le 18/05/2010 17:57, Thierry a écrit :
Correctif : retirer le "pub_naturebien," juste après les ORDER BY
Gilles LAJOT-SARTHOU
2010-05-19 07:23:53 UTC
Permalink
OlivierH,

J'avais remarqué dans mes applications, que le distinct ne fonctionne que sur des champs "texte" de même longueur..j'ai amené soit des PADR() AS soit des CAST()AS pour mettre les aligner les données..

Amicalement
GLS
Membre AtoutFox
"OlivierH" <"nospam[contact]"@planitron.com> a écrit dans le message de news:%***@TK2MSFTNGP04.phx.gbl...
Thierry

Encore un dernier point dans le union il n'accepte pas un champs de type TEXT
"Le type de données text ne peut pas être sélectionné en tant que DISTINCT, car il n'est pas comparable."

As tu une idée de comment je peux l'utiliser ?

Olivier,


Le 18/05/2010 17:57, Thierry a écrit :
Correctif : retirer le "pub_naturebien," juste après les ORDER BY
Gregory Adam
2010-05-19 08:20:09 UTC
Permalink
Salut Thierry,

Tu n'as pas vraiment besoin de la cte dans la premiere solution
--
Gregory
_
Post by Thierry
Bonjour,
Voici 2 solutions :)
N°1
;
WITH cte as
(
SELECT publicite.*, agences.ag_enseigne
, row_number() over ( order by pub_prix asc) as ordre
FROM ...
UNION
SELECT publicite.*, agences.ag_enseigne
, row_number() over (pub_naturebien DESC, pub_nbpieces ASC, pub_prix ASC)
as ordre
FROM ...
)
SELECT * FROM cte ORDER BY pub_naturebien, ordre
N° 2
;
WITH cte as
(
SELECT ...
UNION
SELECT ...
)
SELECT * FROM cte
ORDER BY
pub_naturebien,
CASE WHEN pub_naturebien='MAISON' THEN pub_prix END ASC,
CASE WHEN pub_naturebien<>'MAISON' THEN pub_naturebien END DESC,
CASE WHEN pub_naturebien<>'MAISON' THEN pub_nbpieces END ASC,
CASE WHEN pub_naturebien<>'MAISON' THEN pub_prix END ASC
--
Thierry
Post by OlivierH
Bonjour à tous,
Avez vous une astuce pour avoir deux order différent dans un UNION,
j'ai besoin en sql serveur de lancer en une requête comme celle ci.
(cette requete ne fonctionne pas car il doit avoir qu'un seul order by à
la fin)
SELECT publicite.*, agences.ag_enseigne
FROM publicite
LEFT JOIN agences ON publicite.ag_codeagence=agences.ag_codeagence
Where pub_naturebien='MAISON'
ORDER BY pub_prix ASC
UNION
SELECT publicite.*, agences.ag_enseigne
FROM publicite
LEFT JOIN agences ON publicite.ag_codeagence=agences.ag_codeagence
Where pub_naturebien<>'MAISON'
ORDER BY pub_naturebien DESC, pub_nbpieces ASC, pub_prix ASC
J'ai besoin de recuperer 1 cursor, je ne peux pas en lancer deux afin de
les fusionner.
D'avance merci
Olivier,
Loading...