Menu
Coddy logo textTech

COUNT avec CASE

Fait partie de la section Au-delà des bases du Journey SQL de Coddy — leçon 12 sur 27.

Vous pouvez placer une expression CASE à l'intérieur d'un agrégat. L'astuce est que COUNT ignore NULL, donc un CASE sans ELSE ne compte que les lignes qui correspondent à la condition.

SELECT
    COUNT(*) AS total,
    COUNT(CASE WHEN status = 'active' THEN 1 END) AS active_count
FROM users

Maintenant, active_count est le nombre de lignes 'active' même si nous n'avons pas filtré l'intégralité de la requête. C'est l'astuce derrière chaque requête de tableau de bord multi-métrique que vous écrirez jamais.

challenge icon

Défi

Facile

Tables et colonnes disponibles :

  • <strong>orders</strong> : <strong>id</strong>, <strong>customer_id</strong>, <strong>status</strong>

Pour chaque customer_id, retournez :

  • customer_id
  • total : le nombre total de commandes passées par ce client
  • shipped : le nombre de commandes où status = 'shipped'
  • cancelled : le nombre de commandes où status = 'cancelled'

Retournez uniquement les clients qui ont au moins une commande annulée. Triez par customer_id.

Aide-mémoire

Utilisez CASE à l'intérieur de COUNT pour compter les lignes correspondant à une condition sans filtrer l'ensemble de la requête (COUNT ignore NULL, donc omettez la clause ELSE) :

SELECT
    COUNT(*) AS total,
    COUNT(CASE WHEN status = 'active' THEN 1 END) AS active_count
FROM users

Essayez vous-même

SELECT customer_id,
       COUNT(*) AS total,
       -- shipped, cancelled en utilisant COUNT(CASE ...)
FROM orders
GROUP BY customer_id
-- filtrer pour les clients ayant au moins une annulation
ORDER BY customer_id
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Au-delà des bases