Une CTE donne un nom à un résultat intermédiaire
Une expression de table commune commence par WITH. Elle permet d’utiliser le résultat d’une première requête comme une table temporaire uniquement pendant l’exécution.
La CTE améliore surtout la lisibilité : chaque étape peut porter un nom métier et être contrôlée séparément.
WITH ventes_clients AS (
SELECT id_client, SUM(montant) AS total
FROM commandes
GROUP BY id_client
)
SELECT id_client, total
FROM ventes_clients
ORDER BY total DESC;CASE traduit une règle métier
CASE teste les conditions dans l’ordre et retourne la valeur associée à la première condition vraie. ELSE couvre les autres cas.
Les seuils doivent être exclusifs et faciles à justifier. Commencez généralement par la condition la plus élevée ou la plus restrictive.
SELECT
id_client,
total,
CASE
WHEN total >= 1000 THEN 'VIP'
WHEN total >= 400 THEN 'Fidèle'
ELSE 'Standard'
END AS segment
FROM ventes_clients;Combiner les étapes sans répéter les calculs
La CTE calcule le montant par client une seule fois. La requête finale peut ensuite utiliser ce total dans CASE, dans un filtre ou dans un tri.
Cette séparation rend les erreurs plus faciles à isoler : contrôlez d’abord les totaux, puis ajoutez les segments.
WITH ventes_clients AS (
SELECT id_client, SUM(montant) AS total
FROM commandes
WHERE statut = 'Payée'
GROUP BY id_client
)
SELECT
id_client,
total,
CASE
WHEN total >= 1000 THEN 'VIP'
WHEN total >= 400 THEN 'Fidèle'
ELSE 'Standard'
END AS segment
FROM ventes_clients
ORDER BY total DESC;Garder des étapes courtes et vérifiables
Nommez une CTE selon ce qu’elle représente, comme ventes_clients ou stock_couverture. Évitez les noms vagues comme temp1.
Une longue chaîne de CTE n’est pas automatiquement plus claire. Chaque étape doit accomplir une transformation cohérente et utile au résultat final.
- Testez chaque SELECT intermédiaire.
- Documentez les seuils métier.
- Utilisez ELSE pour ne pas produire un segment NULL par oubli.
Vérifiez votre compréhension
Calculez le total par client dans une CTE puis classez chaque client en Prioritaire à partir de 500 DT, sinon Standard.
WITH totaux AS (
-- total par client
)
SELECT id_client, total,
CASE -- règle métier END AS segment
FROM totaux;Progression
Avez-vous terminé cette leçon ?
Votre choix reste dans ce navigateur et se synchronise aussi avec votre compte lorsque vous êtes connecté.