Article complet: Faire un tri conditionnel

03/06/2008

Permalink 15:37:01, Catégories: Langage SQL (norme), Langage SQL, 322 mots   French (FR) , sqlpro

[SGBD][SQL] Faire un tri conditionnel

SQL permet d'utiliser l'expression CASE à bien des endroits. Un des endroits les moins attendu pour y placer la structure CASE est la clause ORDER BY...
Mais cette astuce permet de faire un tri conditionnel.

[Suite:]

Illustrons notre propos avec un exemple :

CREATE TABLE T_FACTURE  
(FCT_CATEGORIE VARCHAR(16),  
 FCT_MONTANT   DECIMAL(16,2)) 
 
INSERT INTO T_FACTURE VALUES ('Boucherie', 123.45) 
INSERT INTO T_FACTURE VALUES ('Boulangerie', 789.45) 
INSERT INTO T_FACTURE VALUES ('Charcuterie', 5426.21) 
INSERT INTO T_FACTURE VALUES ('Voyage', 9523.21) 
INSERT INTO T_FACTURE VALUES ('Boulangerie', 64.45) 
INSERT INTO T_FACTURE VALUES ('Boucherie', 1584.45) 
INSERT INTO T_FACTURE VALUES ('Charcuterie', 5426.21) 
INSERT INTO T_FACTURE VALUES ('Boucherie', 9684.45) 
 
SELECT FCT_CATEGORIE, SUM(FCT_MONTANT) AS CA 
FROM   T_FACTURE 
GROUP  BY FCT_CATEGORIE 
UNION  ALL 
SELECT 'TOTAL', SUM(FCT_MONTANT) AS CA 
FROM   T_FACTURE 
ORDER  BY 1 
 
FCT_CATEGORIE    CA                                        
---------------- ----------------- 
Boucherie        11392.35 
Boulangerie      853.90 
Charcuterie      10852.42 
TOTAL            32621.88 
Voyage           9523.21

Comment faire en sorte que la ligne de totalisation se retrouve toujours en dernière ligne, malgré que nous voulions les autres catégories triées par ordre alphabétique ?
C'est grâce au CASE que nous allons pouvoir répondre à cette problématique :

SELECT * 
FROM   (SELECT FCT_CATEGORIE, SUM(FCT_MONTANT) AS CA 
        FROM   T_FACTURE 
        GROUP  BY FCT_CATEGORIE 
        UNION  ALL 
        SELECT 'TOTAL' AS FCT_CATEGORIE, SUM(FCT_MONTANT) AS CA 
        FROM   T_FACTURE) AS T 
ORDER  BY CASE WHEN FCT_CATEGORIE = 'TOTAL' THEN 1 ELSE 0 END, 1
FCT_CATEGORIE    CA   
---------------- ------------ 
Boucherie        11392.35  
Boulangerie        853.90  
Charcuterie      10852.42  
Voyage            9523.21  
TOTAL            32621.88

CQFD !

Frédéric BROUARD - SQLpro - MVP SQL Server
Spécialiste SQL/BD modélisation de données
SQL & SGBDR http://sqlpro.developpez.com/
Expert SQL Server : http://www.sqlspot.com
audits - optimisation - tuning - formation

Social Bookmarking:

                                     

Commentaires, Pingbacks:

Connectez-vous pour vous abonner à cet article:

Flux de commentaires pour cet article : Atom 1.0  RSS 2.0
Commentaire de: azur668 [Membre]
C'est bien pour un petit nombre de lignes, mais si il y a beaucoup de données, au niveau performance, il vaut mieux faire :
SELECT 0 as tri, FCT_CATEGORIE, SUM(FCT_MONTANT) AS CA
FROM T_FACTURE
GROUP BY FCT_CATEGORIE
UNION ALL
SELECT 1 as tri, 'TOTAL', SUM(FCT_MONTANT) AS CA
FROM T_FACTURE
ORDER BY tri
Permalien 09/12/2008 @ 13:57
Commentaire de: sqlpro [Membre] · http://sqlpro.developpez.com
Je ne crois pas qu'il y aura la moindre différence d'exécution au niveau des plans de requête !

A +
Permalien 09/12/2008 @ 20:26
Commentaire de: azur668 [Membre]
Non, pas au niveau du plan de requête, mais un CASE nécessite forcément un traitement logique pour obtenir l'information, qui devra être effectué pour chaque ligne, alors que avec Select 1, la valeur est disponible directement.

mais je n'ai pas mesuré


Permalien 17/12/2008 @ 17:44
Commentaire de: sqlpro [Membre] · http://sqlpro.developpez.com
...> un CASE nécessite forcément un traitement logique pour obtenir l'information, qui devra être effectué pour chaque ligne,
Permalien 18/12/2008 @ 00:44
Commentaire de: sqlpro [Membre] · http://sqlpro.developpez.com
"un CASE nécessite forcément un traitement logique pour obtenir l'information, qui devra être effectué pour chaque ligne,"

Ceci n'est pas vrai sur tous les SGBDR. par exemple SQL Server optimise le CASE.

A +
Permalien 18/12/2008 @ 00:56

Vous devez être identifié pour poster un commentaire.

Liste des blogs

< Le blog de SQLpro/>

Fred Brouard alias SQLpro

Rechercher

<  Avril 2012  >
Lun Mar Mer Jeu Ven Sam Dim
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

Syndiquez ce blog XML

Articles :

Commentaires :

 
 
 
 
Partenaires

Hébergement Web