From 76f08b5d4a1317288da3712e3e2ee07915260cf2 Mon Sep 17 00:00:00 2001 From: medina5 Date: Thu, 28 Aug 2025 13:28:41 +0200 Subject: [PATCH] =?UTF-8?q?R=C3=A9ponses?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Réponses/aggregation.sql | 112 +++++++++++++++++++++------------------ exercice.md | 15 +++--- 2 files changed, 69 insertions(+), 58 deletions(-) diff --git a/Réponses/aggregation.sql b/Réponses/aggregation.sql index fe84053..6713437 100644 --- a/Réponses/aggregation.sql +++ b/Réponses/aggregation.sql @@ -1,76 +1,86 @@ -- Réponses --- 1 : Quel est le nombre total de ticket enregistrés dans la base ? +-- 1a : Quel est le nombre total de ticket enregistrés dans la base ? +-- 101 615 SELECT COUNT(*) AS nb_ticket FROM ticket; +-- 1b : Quel est le nombre total d'adhérents enregistrés dans la base ? +-- 2800 +SELECT COUNT(*) AS nb_adherent +FROM adherent; + -- 2 : Calculer le chiffre d’affaires global. +-- 1 881 766.53085 SELECT SUM(quantite * prix_unitaire) AS montant_total -FROM Lignesticket; +FROM ligne; --- 3 : Pour chaque client, afficher son nom et le nombre de ticket qu’il a effectués. -SELECT c.nom, COUNT(t.id_ticket) AS nb_ticket -FROM client c -JOIN ticket t ON c.id_client = t.id_client -GROUP BY c.nom; +-- 3 : Pour chaque adhérent, afficher son nom et le nombre de ticket qu’il a effectués. +SELECT a.nom, + COUNT(t.id) AS nb_ticket +FROM adherent a +JOIN ticket t ON a.id = t.client_id +GROUP BY a.id; --- 4 : Calculer le montant moyen d’un ticket (total ventes ÷ nombre de ticket). +-- 4 : Calculer le montant moyen d’un ticket. +-- 18.52 SELECT AVG(total_ticket) AS panier_moyen FROM ( - SELECT t.id_ticket, SUM(lt.quantite * lt.prix_unitaire) AS total_ticket + SELECT t.id, SUM(l.quantite * l.prix_unitaire) AS total_ticket FROM ticket t - JOIN Lignesticket lt ON t.id_ticket = lt.id_ticket - GROUP BY t.id_ticket + JOIN ligne l ON t.id = l.ticket_id + GROUP BY t.id ) sous_requete; -- 5 : Afficher le produit le plus cher et le produit le moins cher (avec leur prix). -SELECT nom_produit, prix_unitaire -FROM Produits -ORDER BY prix_unitaire DESC +SELECT article.article, prix +FROM article +ORDER BY prix DESC LIMIT 1; -SELECT nom_produit, prix_unitaire -FROM Produits -ORDER BY prix_unitaire ASC +SELECT article.article, prix +FROM article +ORDER BY prix ASC LIMIT 1; --- 6 : Pour chaque famille de produits, afficher le nom de la famille et le nombre de produits associés. -SELECT f.nom_famille, COUNT(p.id_produit) AS nb_produits -FROM Familles f -LEFT JOIN Produits p ON f.id_famille = p.id_famille -GROUP BY f.nom_famille; +-- 6 : Pour chaque famille, afficher le nom de la famille et le nombre d'articles associés. +SELECT f.intitule, COUNT(a.code) AS nb_produits +FROM famille f +LEFT JOIN article a ON f.famille = a.famille +GROUP BY f.intitule; -- 7 : Afficher, pour chaque mois, le chiffre d’affaires réalisé. -SELECT DATE_TRUNC('month', t.date_vente) AS mois, - SUM(lt.quantite * lt.prix_unitaire) AS montant_mensuel +SELECT DATE_TRUNC('month', t.date_ticket) AS mois, + SUM(l.quantite * l.prix_unitaire) AS montant_mensuel FROM ticket t -JOIN Lignesticket lt ON t.id_ticket = lt.id_ticket -GROUP BY DATE_TRUNC('month', t.date_vente) +JOIN ligne l ON t.id = l.ticket_id +GROUP BY DATE_TRUNC('month', t.date_ticket) ORDER BY mois; --- 8 : Trouver le client qui a dépensé le plus en montant total. -SELECT c.nom, SUM(lt.quantite * lt.prix_unitaire) AS total_depense -FROM client c -JOIN ticket t ON c.id_client = t.id_client -JOIN Lignesticket lt ON t.id_ticket = lt.id_ticket +-- 8 : Trouver les 10 adhérents qui ont dépensé le plus en montant total. +SELECT c.nom, SUM(l.quantite * l.prix_unitaire) AS total_depense +FROM adherent c +JOIN ticket t ON c.id = t.client_id +JOIN ligne l ON t.id = l.ticket_id GROUP BY c.nom ORDER BY total_depense DESC -LIMIT 1; +LIMIT 10; --- 9 : Afficher le produit ayant généré le plus de ventes en quantité totale vendue. -SELECT p.nom_produit, SUM(lt.quantite) AS total_vendu -FROM Produits p -JOIN Lignesticket lt ON p.id_produit = lt.id_produit -GROUP BY p.nom_produit +-- 9 : Afficher l'article ayant généré le plus de ventes en quantité totale vendue. +SELECT a.article, SUM(l.quantite) AS total_vendu +FROM article a +JOIN ligne l ON a.code = l.article +GROUP BY a.article ORDER BY total_vendu DESC -LIMIT 1; +LIMIT 1 -- 10 : Pour chaque famille, afficher le montant total des ventes. -SELECT f.nom_famille, SUM(lt.quantite * lt.prix_unitaire) AS total_famille -FROM Familles f -JOIN Produits p ON f.id_famille = p.id_famille -JOIN Lignesticket lt ON p.id_produit = lt.id_produit -GROUP BY f.nom_famille +SELECT f.famille, + SUM(l.quantite * l.prix_unitaire) AS total_famille +FROM famille f +JOIN article a ON f.famille = a.famille +JOIN ligne l ON a.code = l.article +GROUP BY f.famille ORDER BY total_famille DESC; -- ---------- @@ -117,7 +127,7 @@ SELECT p.nom_produit, CASE WHEN EXISTS ( SELECT 1 - FROM Lignesticket lt + FROM ligne lt WHERE lt.id_produit = p.id_produit ) THEN TRUE ELSE FALSE END AS deja_vendu FROM Produits p @@ -128,7 +138,7 @@ SELECT p.nom_produit, COALESCE(SUM(CASE WHEN lt.id_ligne IS NOT NULL THEN 1 ELSE 0 END), 0) > 0 AS deja_vendu FROM Produits p -LEFT JOIN Lignesticket lt ON lt.id_produit = p.id_produit +LEFT JOIN ligne lt ON lt.id_produit = p.id_produit GROUP BY p.id_produit, p.nom_produit; -- 6 : ANTI-JOIN (différence) @@ -147,8 +157,8 @@ SELECT DISTINCT c2.nom AS client_2 FROM client c1 JOIN ticket t1 ON t1.id_client = c1.id_client -JOIN Lignesticket lt1 ON lt1.id_ticket = t1.id_ticket -JOIN Lignesticket lt2 ON lt2.id_produit = lt1.id_produit +JOIN ligne lt1 ON lt1.id_ticket = t1.id_ticket +JOIN ligne lt2 ON lt2.id_produit = lt1.id_produit JOIN ticket t2 ON t2.id_ticket = lt2.id_ticket JOIN client c2 ON c2.id_client = t2.id_client WHERE c1.id_client < c2.id_client; @@ -166,7 +176,7 @@ Lister les ticket contenant au moins un produit de la famille "Boissons". SELECT DISTINCT c.id_client, c.nom FROM client c JOIN ticket t ON t.id_client = c.id_client -JOIN Lignesticket lt ON lt.id_ticket = t.id_ticket +JOIN ligne lt ON lt.id_ticket = t.id_ticket JOIN Produits p ON p.id_produit = lt.id_produit JOIN Familles f ON f.id_famille = p.id_famille WHERE f.nom_famille = 'Boissons' @@ -178,7 +188,7 @@ FROM client c WHERE NOT EXISTS ( SELECT 1 FROM ticket t - JOIN Lignesticket lt ON lt.id_ticket = t.id_ticket + JOIN ligne lt ON lt.id_ticket = t.id_ticket JOIN Produits p ON p.id_produit = lt.id_produit JOIN Familles f ON f.id_famille = p.id_famille WHERE t.id_client = c.id_client @@ -191,7 +201,7 @@ FROM client c LEFT JOIN ( SELECT DISTINCT t.id_client FROM ticket t - JOIN Lignesticket lt ON lt.id_ticket = t.id_ticket + JOIN ligne lt ON lt.id_ticket = t.id_ticket JOIN Produits p ON p.id_produit = lt.id_produit JOIN Familles f ON f.id_famille = p.id_famille WHERE f.nom_famille = 'Boissons' @@ -208,6 +218,6 @@ SELECT SUM(lt.quantite * lt.prix_unitaire) AS total_ventes FROM Familles f JOIN Produits p ON p.id_famille = f.id_famille -JOIN Lignesticket lt ON lt.id_produit = p.id_produit +JOIN ligne lt ON lt.id_produit = p.id_produit GROUP BY f.nom_famille ORDER BY total_ventes DESC; diff --git a/exercice.md b/exercice.md index 500d7c6..6b33c4e 100644 --- a/exercice.md +++ b/exercice.md @@ -2,13 +2,14 @@ ## Série 1 -- 1 : Quel est le nombre total de tickets enregistrés dans la base ? +- 1a : Quel est le nombre total de ticket enregistrés dans la base ? +- 1b : Quel est le nombre total d'adhérents enregistrés dans la base ? - 2 : Calculer le chiffre d’affaires global. -- 3 : Pour chaque client, afficher son nom et le nombre de tickets qu’il a effectués. -- 4 : Calculer le montant moyen d’un ticket (total ventes ÷ nombre de tickets). -- 5 : Afficher le produit le plus cher et le produit le moins cher (avec leur prix). -- 6 : Pour chaque famille de produits, afficher le nom de la famille et le nombre de produits associés. +- 3 : Pour chaque adhérent, afficher son nom et le nombre de ticket qu’il a effectués. +- 4 : Calculer le montant moyen d’un ticket. +- 5 : Afficher l'article le plus cher et l'article le moins cher (avec leur prix). +- 6 : Pour chaque famille, afficher le nom de la famille et le nombre d'articles associés. - 7 : Afficher, pour chaque mois, le chiffre d’affaires réalisé. -- 8 : Trouver le client qui a dépensé le plus en montant total. -- 9 : Afficher le produit ayant généré le plus de ventes en quantité totale vendue. +- 8 : Trouver l'adhérent qui a dépensé le plus en montant total. +- 9 : Afficher l'article ayant généré le plus de ventes en quantité totale vendue. - 10 : Pour chaque famille, afficher le montant total des ventes.