IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[UNION] order by sur chaque partie de la requête


Sujet :

Langage SQL

  1. #1
    Débutant
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 125
    Points : 704
    Points
    704
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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


  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Pourquoi ne pas tout faire en une seule requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 125
    Points : 704
    Points
    704
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Pourquoi ne pas tout faire en une seule requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case 
    	when (niveau = 'SE')
    	then emplacement_T
    	end ASC;
    ?

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *, '1' AS tri
    ....
    SELECT *, '2' AS tri

  5. #5
    Débutant
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 125
    Points : 704
    Points
    704
    Par défaut
    ok ca fonctionne.
    Merci

    Requete final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/01/2013, 17h52
  2. Réponses: 2
    Dernier message: 07/06/2010, 04h13
  3. Faire un ORDER BY sur un champ
    Par Jeankiki dans le forum Bases de données
    Réponses: 3
    Dernier message: 03/05/2004, 00h59
  4. n INDEXs sur chaque champ ou 1 seul INDEX sur n ch
    Par fourchette dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/04/2004, 11h55
  5. order by sur plusieurs tables
    Par Mad_Max dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/12/2003, 13h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo