Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Débutant
    Homme Profil pro Jérémy
    Développeur Web
    Inscrit en
    octobre 2006
    Messages
    1 121
    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 121
    Points : 640
    Points
    640

    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

  2. #2
    Modérateur

    Homme Profil pro Fabien
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    6 893
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien
    Âge : 36
    Localisation : France, Paris (Î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 893
    Points : 14 332
    Points
    14 332

    Par défaut

    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;

  3. #3
    Débutant
    Homme Profil pro Jérémy
    Développeur Web
    Inscrit en
    octobre 2006
    Messages
    1 121
    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 121
    Points : 640
    Points
    640

    Par défaut

    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

  4. #4
    Expert Confirmé Sénior
    Inscrit en
    août 2008
    Messages
    2 185
    Détails du profil
    Informations forums :
    Inscription : août 2008
    Messages : 2 185
    Points : 4 022
    Points
    4 022

    Par défaut

    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

  5. #5
    Débutant
    Homme Profil pro Jérémy
    Développeur Web
    Inscrit en
    octobre 2006
    Messages
    1 121
    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 121
    Points : 640
    Points
    640

    Par défaut

    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

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •