Accueil/Blog/Ecrire des requêtes puissantes et lisibles
SQL | Data Analysis27 avril 2026

Ecrire des requêtes puissantes et lisibles

Cet article s’adresse aux analystes, data engineers et développeurs qui maîtrisent déjà les bases de SQL et souhaitent passer au niveau supérieur. Nous allons couvrir, de manière structurée, progressive et simple, les concepts avancés indispensables pour écrire des requêtes SQL robustes, lisibles et performantes.

Ecrire des requêtes puissantes et lisibles

1. Comprendre et appliquer les fonctions de fenêtrage (Window Functions)

Les fonctions de fenêtrage permettent d’effectuer des calculs sur un ensemble de lignes sans les regrouper comme avec GROUP BY.

Principe clé

Une fonction de fenêtrage s’écrit avec la clause OVER().

1SELECT 2 client_id, 3 montant, 4 SUM(montant) OVER (PARTITION BY client_id) AS total_client 5FROM transactions; 6

👉 Ici, chaque ligne conserve son détail tout en affichant un total par client.

Cas d’usage

  • Calculs cumulés
  • Classements
  • Comparaisons ligne à ligne

2. Fonctions de classement : RANK, DENSE_RANK et ROW_NUMBER

Ces fonctions sont utilisées pour produire des rapports de classement.

ROW_NUMBER()

Attribue un numéro unique à chaque ligne.

ROW_NUMBER() OVER (ORDER BY montant DESC)

RANK()

Génère un rang avec des sauts en cas d’égalité.

RANK() OVER (ORDER BY montant DESC)

DENSE_RANK()

Génère un rang sans saut.

DENSE_RANK() OVER (ORDER BY montant DESC)

Quand utiliser quoi ?

BesoinFonction
Numérotation stricteROW_NUMBER
Classement officielRANK
Classement compactDENSE_RANK

3. Calculer les totaux et sommes cumulatives

Les sommes cumulatives sont très utilisées en finance et reporting.

1SELECT 2 date_tx, 3 montant, 4 SUM(montant) OVER ( 5 ORDER BY date_tx 6 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 7 ) AS cumul_montant 8FROM transactions; 9

👉 Chaque ligne contient le total cumulé jusqu’à cette date.


4. Rapports complexes avec GROUP BY et CASE WHEN

La combinaison de GROUP BY et CASE WHEN permet de créer des indicateurs métiers.

1SELECT 2 pays, 3 COUNT(*) AS total_tx, 4 SUM(CASE WHEN statut = 'SUCCESS' THEN montant ELSE 0 END) AS montant_success, 5 SUM(CASE WHEN statut = 'ECHEC' THEN 1 ELSE 0 END) AS nb_echecs 6FROM transactions 7GROUP BY pays; 8

👉 Idéal pour les tableaux de bord et rapports de performance.


5. ROLLUP, CUBE et GROUPING SETS

Ces opérateurs permettent de générer plusieurs niveaux d’agrégation.

ROLLUP

Agrégations hiérarchiques.

GROUP BY ROLLUP(pays, ville)

CUBE

Toutes les combinaisons possibles.

GROUP BY CUBE(pays, ville)

GROUPING SETS

Contrôle précis des agrégations.

1GROUP BY GROUPING SETS ( 2 (pays), 3 (ville), 4 () 5) 6

Comparaison rapide

OpérationUsage
ROLLUPTotaux progressifs
CUBEAnalyse multidimensionnelle
GROUPING SETSReporting sur mesure

6. Utiliser les CTE (Common Table Expressions)

Les CTE rendent les requêtes longues lisibles et maintenables.

1WITH tx_filtrees AS ( 2 SELECT * 3 FROM transactions 4 WHERE date_tx >= '2025-01-01' 5) 6SELECT pays, SUM(montant) 7FROM tx_filtrees 8GROUP BY pays; 9

Avantages

  • Lisibilité
  • Réutilisabilité
  • Débogage simplifié

7. Requêtes SQL récursives pour les données hiérarchiques

Les CTE récursives sont idéales pour gérer des arbres, hiérarchies et graphes.

Exemple : hiérarchie d’employés

1WITH RECURSIVE hierarchie AS ( 2 SELECT id, nom, manager_id, 1 AS niveau 3 FROM employes 4 WHERE manager_id IS NULL 5 6 UNION ALL 7 8 SELECT e.id, e.nom, e.manager_id, h.niveau + 1 9 FROM employes e 10 JOIN hierarchie h ON e.manager_id = h.id 11) 12SELECT * FROM hierarchie; 13

👉 Cette requête reconstruit toute la chaîne hiérarchique.


Conclusion

La maîtrise de ces concepts SQL avancés permet de :

  • Réduire la complexité des requêtes
  • Produire des rapports fiables et lisibles
  • Gagner en performance et en clarté

Ces techniques sont aujourd’hui indispensables en data analysis, BI et fraude.


💡 Conseil pratique : entraînez-vous avec des jeux de données réels (transactions, logs, ventes) pour bien intégrer ces notions.