Précédent   Forum du club des développeurs et IT Pro > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 28/12/2012, 11h29   #1
afrodje
Débutant
 
Homme Jérémy
Développeur Web
Inscription : octobre 2006
Messages : 1 108
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 1 108
Points : 643
Points : 643
Par défaut [UNION] order by sur chaque partie de la requête

Bonjour,

J'ai 2 requêtes sur une même table dont je voudrais faire un UNION mais les 2 requêtes ont un WHERE et ORDER BY différent.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT * 
FROM 
(
	SELECT *, '1' AS tri
	FROM BP_total
	WHERE numero_bp = '664270'
	AND kit_SDCOMM <> 'K' AND kit_SDKTLN = 0  AND niveau <> 'SE'
	ORDER BY emplacement_T
 
	UNION
 
	SELECT *, '2' AS tri
	FROM BP_total
	WHERE numero_bp = '664270'
	AND (kit_SDCOMM = 'K' OR kit_SDKTLN <> 0)
	ORDER BY cast(REPLACE(REPLACE(numero_ligne ,'.' , '') ,',' , '') AS int)
) A
ORDER BY tri
Comment faire sachant que l'UNION fonctionne avec un seul ORDER BY?
PS : SQL SERVER 2005

__________________
Évènements dans le 06?
www.sortir06.com
afrodje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 11h38   #2
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 276
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2008
Messages : 6 276
Points : 13 555
Points : 13 555
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Pourquoi ne pas tout faire en une seule requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
  SELECT *
    FROM BP_total
   WHERE numero_bp = '664270'
     AND ((kit_SDCOMM <> 'K' AND kit_SDKTLN = 0  AND niveau <> 'SE')
      OR  (kit_SDCOMM = 'K' OR kit_SDKTLN <> 0))
ORDER BY case when kit_SDCOMM <> 'K' then 1 else 2 end ASC
       , case
           when kit_SDCOMM <> 'K'
           then emplacement_T
           else cast(REPLACE(REPLACE(numero_ligne ,'.' , '') ,',' , '') AS int)
         end ASC;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/12/2012, 12h14   #3
afrodje
Débutant
 
Homme Jérémy
Développeur Web
Inscription : octobre 2006
Messages : 1 108
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 1 108
Points : 643
Points : 643
Citation:
Envoyé par Waldar Voir le message
Pourquoi ne pas tout faire en une seule requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
  SELECT *
    FROM BP_total
   WHERE numero_bp = '664270'
     AND ((kit_SDCOMM <> 'K' AND kit_SDKTLN = 0  AND niveau <> 'SE')
      OR  (kit_SDCOMM = 'K' OR kit_SDKTLN <> 0))
ORDER BY case when kit_SDCOMM <> 'K' then 1 else 2 end asc
       , case
           when kit_SDCOMM <> 'K'
           then emplacement_T
           else cast(REPLACE(REPLACE(numero_ligne ,'.' , '') ,',' , '') AS int)
         end asc;
C'est une syntaxe que j'ignorai. Effectivement c'est mieux.

Par contre, a quoi correspond then 1 else 2 ?

Si je veux rajouter un trie supplémentaire selon une condition, je rajoute simplement
Code :
1
2
3
4
case 
	when (niveau = 'SE')
	then emplacement_T
	end ASC;
?
__________________
Évènements dans le 06?
www.sortir06.com
afrodje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 15h12   #4
skuatamad
Expert Confirmé
 
Inscription : août 2008
Messages : 1 690
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 690
Points : 2 813
Points : 2 813
Citation:
Envoyé par afrodje Voir le message
Par contre, a quoi correspond then 1 else 2 ?
Ca correspond au tri de la requête d'origine :
Code :
1
2
3
SELECT *, '1' AS tri
....
SELECT *, '2' AS tri
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 15h37   #5
afrodje
Débutant
 
Homme Jérémy
Développeur Web
Inscription : octobre 2006
Messages : 1 108
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 1 108
Points : 643
Points : 643
ok ca fonctionne.
Merci

Requete final :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT *
FROM BP_total
WHERE numero_bp = '664270'
     AND (
			(kit_SDCOMM <> 'K' AND kit_SDKTLN = 0  AND niveau <> 'SE')
			OR (kit_SDCOMM = 'K' OR kit_SDKTLN <> 0)
			OR (niveau = 'SE')
		 )
ORDER BY 
		case 
				when (niveau = 'SE')
				then 1
				end ASC,
		case
				when (kit_SDCOMM = 'K' OR kit_SDKTLN <> 0)
				then cast(REPLACE(REPLACE(numero_ligne ,'.' , '') ,',' , '') AS int)
				end ASC,
 
		case 
				when (kit_SDCOMM <> 'K' AND kit_SDKTLN = 0  AND niveau <> 'SE') 
					then emplacement_T
				end ASC;
__________________
Évènements dans le 06?
www.sortir06.com
afrodje est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h47.


 
 
 
 
Partenaires

Hébergement Web