DCG · UE 8 · Atelier corrigé

Atelier SQL — Conserver les clients sans facture

Couverture de l’UE : Première version : chaque rubrique du sommaire dispose d’un cours de méthode. La couverture reste partielle : approfondissements encore nécessaires en normalisation, fonctions de tableur, programmation VBA exécutée dans Excel, diagrammes BPMN complets et cas transversaux. Les exercices SQL sont contrôlés sur un jeu d’essai SQLite ; les particularités d’autres SGBD et tableurs doivent être vérifiées.

Objectif : Appliquer la méthode et expliquer ses contrôles.

Jeu de données de cet atelier

Clients : (1, Alma), (2, Boréal), (3, Cyprès). Factures (identifiant, client, montant en euros) : (10, 1, 600), (11, 1, −100), (12, 2, 300), (13, 2, 250), (14, 1, NULL). Le client 3 n’a aucune facture. NULL est un montant non renseigné.

Données du cas

Reprenez les tables du premier atelier. Client(id_client, nom) est reliée à Facture(id_facture, id_client, montant). Pour la restitution, on décide explicitement d’afficher zéro lorsque la somme connue est absente, sans prétendre qu’une valeur inconnue était réellement zéro.

Démarche

Définissez le résultat attendu avant de choisir la formule ou la requête. Contrôlez les valeurs manquantes, les limites et le périmètre. Comparez votre réponse au corrigé en distinguant calcul, interprétation et conditions d’exécution.

Exercice

Retournez tous les clients avec le nombre de factures et la somme des montants connus. Triez par identifiant. Expliquez le choix de la colonne comptée.

Afficher le corrigé expliqué

SELECT c.id_client, c.nom, COUNT(f.id_facture) AS nombre, COALESCE(SUM(f.montant), 0) AS total FROM Client c LEFT JOIN Facture f ON c.id_client = f.id_client GROUP BY c.id_client, c.nom ORDER BY c.id_client; Résultat : (1, Alma, 3, 500), (2, Boréal, 2, 550), (3, Cyprès, 0, 0). COUNT(f.id_facture) ignore la valeur NULL issue de l’absence de facture ; COUNT(*) aurait compté une ligne pour Cyprès. Pour Alma, COUNT(f.montant) vaudrait 2 car un montant manque, alors que trois factures existent.

Question de validation

Pour Cyprès, COUNT(*) dans cette jointure vaut :

  1. 0
  2. 1
  3. 3
Vérifier la réponse

Réponse B : 1

LEFT JOIN conserve une ligne pour Cyprès, même sans facture. COUNT(*) compte cette ligne ; COUNT(f.id_facture) ignore la valeur NULL et retourne zéro.

Sources complémentaires

Repères théoriques ; exemples et exercices originaux.

Référentiel

Annexe officielle DCG · Bulletin officiel

Ouvrir ce cours dans l’espace interactif →