Réponses

2025-08-28 13:28:41 +02:00
parent 3f5181dc66
commit 76f08b5d4a
2 changed files with 69 additions and 58 deletions

@@ -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 daffaires 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 quil 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 quil 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 dun ticket (total ventes ÷ nombre de ticket).
-- 4 : Calculer le montant moyen dun 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 daffaires 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;

@@ -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 daffaires global.
- 3 : Pour chaque client, afficher son nom et le nombre de tickets quil a effectués.
- 4 : Calculer le montant moyen dun 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 quil a effectués.
- 4 : Calculer le montant moyen dun 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 daffaires 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.