From 354cd0c93932616121f4485a38781011e1abb640 Mon Sep 17 00:00:00 2001 From: medina5 Date: Fri, 29 Aug 2025 07:44:46 +0200 Subject: [PATCH] Ajustements questions --- Réponses/aggregation.sql | 155 ++++++++++++++++++++++++--------------- exercice.md | 39 +++++++--- 2 files changed, 123 insertions(+), 71 deletions(-) diff --git a/Réponses/aggregation.sql b/Réponses/aggregation.sql index 6713437..a2b23f5 100644 --- a/Réponses/aggregation.sql +++ b/Réponses/aggregation.sql @@ -1,87 +1,100 @@ -- Réponses --- 1a : Quel est le nombre total de ticket enregistrés dans la base ? +-- 1a : Quel est le nombre total de ticket ? -- 101 615 -SELECT COUNT(*) AS nb_ticket -FROM ticket; +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; +-- 1b : Quel est le nombre total d'adhérents ? +-- 2439 +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 ligne; +select sum(quantite * prix_unitaire) as chiffre_affaire from ligne; --- 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; +-- 3a : Pour chaque adhérent, afficher son nom et son nombre de ticket. +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; + +-- 3b : Pour chaque adhérent, afficher son nom et son nombre de ticket. +select a.nom, + count(t.id) as nb_ticket +from adherent a +join ticket t on a.id = t.client_id +where a.nom = 'Lavergne' +group by a.id; + +-- 3c : Pour chaque adhérent, afficher son nom et son nombre de ticket. +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 +having count(t.id) = 72; -- 4 : Calculer le montant moyen d’un ticket. -- 18.52 -SELECT AVG(total_ticket) AS panier_moyen -FROM ( - SELECT t.id, SUM(l.quantite * l.prix_unitaire) AS total_ticket - FROM ticket t - JOIN ligne l ON t.id = l.ticket_id - GROUP BY t.id +select avg(total_ticket) as panier_moyen +from ( + select t.id, sum(l.quantite * l.prix_unitaire) as total_ticket + from ticket t + 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 article.article, prix -FROM article -ORDER BY prix DESC -LIMIT 1; +select article.article, prix +from article +order by prix desc +limit 1; -SELECT article.article, prix -FROM article -ORDER BY prix ASC -LIMIT 1; +select article.article, prix +from article +order by prix asc +limit 1; --- 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; +-- 6a : Pour chaque famille, afficher le nom de la famille et le nombre d'articles associés. +select f.famille, count(a.code) as nb_produits +from famille f +left join article a on f.code = a.famille +group by f.famille; -- 7 : Afficher, pour chaque mois, le chiffre d’affaires réalisé. -SELECT DATE_TRUNC('month', t.date_ticket) AS mois, - SUM(l.quantite * l.prix_unitaire) AS montant_mensuel -FROM ticket t -JOIN ligne l ON t.id = l.ticket_id -GROUP BY DATE_TRUNC('month', t.date_ticket) -ORDER BY mois; +select date_trunc('month', t.date_ticket) as mois, + sum(l.quantite * l.prix_unitaire) as montant_mensuel +from ticket t +join ligne l on t.id = l.ticket_id +group by date_trunc('month', t.date_ticket) +order by mois; --- 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 10; +-- 8 : Trouver les 3 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 3; -- 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 +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 -- 10 : Pour chaque famille, afficher le montant total des ventes. -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; +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; -- ---------- @@ -221,3 +234,23 @@ JOIN Produits p ON p.id_famille = f.id_famille JOIN ligne lt ON lt.id_produit = p.id_produit GROUP BY f.nom_famille ORDER BY total_ventes DESC; + +-- +select f.code, f.famille, count(a.code) as nb_produits +from famille f +left join article a on f.code = a.famille +group by f.code having count(a.code) = 0 order by f.code; + +select distinct a.famille from article a +left join famille f on f.code = a.famille +where f.code is null +order by a.famille + +SELECT DISTINCT ON (f.code) + f.code AS famille_id, + f.famille AS famille_nom, + a.article AS article_exemple +FROM famille f +LEFT JOIN article a ON a.famille = f.code +where f.famille is null +ORDER BY f.code, a.code; diff --git a/exercice.md b/exercice.md index 6b33c4e..60e40ac 100644 --- a/exercice.md +++ b/exercice.md @@ -2,14 +2,33 @@ ## Série 1 -- 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 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 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. +- 1a : Quel est le nombre total de ticket ? +- 1b : Quel est le nombre total d'adhérents ? +- 2 : Calculer le chiffre d’affaires global. +- 3a : Pour chaque adhérent, afficher son nom et son nombre de ticket. +- 3b : Quel est le détail du nombre de ticket pour ceux dont le nom de famille est Lavergne ? +- 3c : Quels sont les personnes qu iont exactement 72 tickets ? +- 4 : Calculer le montant moyen d’un ticket. +- 5 : Afficher l'article le plus cher et l'article le moins cher (avec leur prix). +- 6a : Pour chaque famille, afficher le nom de la famille et le nombre d'articles associés. +- 6b : Quel est le nombre d'article de la famille +- 7 : Afficher, pour chaque mois, le chiffre d’affaires réalisé. +- 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. + +## Série 2 + +- 1 : Lister tous les tickets avec le nom du client. Afficher uniquement les tickets qui ont un client existant. +- 2 : Lister tous les clients et le nombre de tickets associés, même les clients qui n’ont pas encore de ticket doivent apparaître (avec 0). +- 3 : Lister tous les tickets, avec le nom du client s’il existe. Si un ticket a perdu sa référence client (valeur orpheline), il doit tout de même apparaître. +- 4 : Lister tous les clients et tous les tickets, même si la correspondance n’existe pas. Union des clients sans tickets et des tickets sans clients. +- 5 : Lister uniquement les clients qui ont acheté au moins un produit. +- 6 : Lister les clients qui n’ont jamais acheté de produit. +- 7 : Lister les produits avec leur famille, même si certains produits n’ont pas de famille renseignée. +- 8 : Lister tous les couples de clients qui habitent dans la même ville. +- 9 : Lister toutes les combinaisons possibles de familles et de clients (sans condition de jointure). +- 10 : Lister les tickets contenant au moins un produit de la famille "Boissons". + + +- Lister