diff --git a/Exercices.md b/Exercices.md index 9086a3f..d2f29c6 100644 --- a/Exercices.md +++ b/Exercices.md @@ -1,13 +1,6 @@ # Exercices -## 2. Jointures - - -- 2a : Quel est l'article qui n'a jamais été commandé ? -- 2b : Quels sont les articles qui apparaissent qu'une seule fois -- 3 : Lister les articles dont la famille est absente - - 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. diff --git a/Home.md b/Home.md index eda4807..7299af5 100644 --- a/Home.md +++ b/Home.md @@ -10,11 +10,6 @@ Arrondir les montant à deux chiffres après la virgule. -- 1a : Quel est le nombre total de ticket ? (101 616) -- 1b : Quel est le nombre total d'adhérents ? (2439) -- 1c : Quel est le nombre total d'articles ? (1099) -- 1d : Quel est le nombre total de familles ? (159) -- 2 : Calculer le chiffre d’affaires global. (1 914 792.40) - 3a : Pour chaque adhérent unique, 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 ? (11 et 2) - 3c : Quels sont les personnes qui ont exactement 72 tickets ? (Cote et Lebreton) @@ -24,6 +19,7 @@ Arrondir les montant à deux chiffres après la virgule. - 5c : Calculer le nombre moyen d'article d'un ticket. Les articles facturés au poids comptent pour 1. (7.22) - 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 02CHOU. (29) +- 6c : Quelles sont les familles qui ont 2 ou moins d'articles ? () - 7a : Afficher, pour chaque mois, le chiffre d’affaires réalisé. - 7b : Quel est le chiffre d'affaire du mois d'avril 2016. (20042.39) - 8 : Trouver les 3 adhérents qui ont dépensé le plus en montant total. (Collot, Gérard, Blandin) @@ -32,8 +28,12 @@ Arrondir les montant à deux chiffres après la virgule. - 10a : Pour chaque famille, afficher le montant total des ventes. - 10b : Quel est le montant total des ventes de la famille 03FRAISE. (10368.69) -- 11a : Combien d'adhérents n’ont jamais acheté d'article ? -- 11b : Combien d'adhérents n’ont aucun ticket ? -- 11c : Combien de tickets sont vides (sans ligne) +- 11a : Combien d'adhérents n’ont jamais acheté d'article ? (273) +- 11b : Combien d'adhérents n’ont aucun ticket ? (261) +- 11c : Combien de tickets sont vides (sans ligne). (12) +- 12a : Quel est l'article qui n'a jamais été commandé ? (Chocolat Noir 80% Framboise Myrtilles) +- 12b : Quels sont les articles qui apparaissent qu'une seule fois dans les lignes de ticket (Ananas séché 100g, ...) +- 13 : Lister les articles dont la famille est absente. (MENMA) +- 14 : Lister les tickets qui contiennent l’article le plus cher du catalogue. - 20 : Quel adhérent est en double (même nom, prénom, date de naissance) diff --git a/Réponses/1-10.sql b/Réponses/1-10.sql index 5fa7d83..7ef30fe 100644 --- a/Réponses/1-10.sql +++ b/Réponses/1-10.sql @@ -1,25 +1,5 @@ -- Réponses questions de 1 à 10 --- 1a : 101 616 -select count(*) as nb_ticket from ticket; - --- 1b : 2439 -select count(*) as nb_adherent from adherent; - --- 1c : 1099 -select count(*) as nb_articles from article; - --- 1d : 159 -select count(*) as nb_familles from famille; - --- ------------------------------------------------------------ - --- 2 : 1 914 792.40 -select round(sum(quantite * prix_unitaire), 2) as chiffre_affaire from ligne; - --- 2: 1 915 049.36 -select sum(round(quantite * prix_unitaire, 2)) as chiffre_affaire from ligne; - -- 3a : Pour chaque adhérent unique, afficher son nom et son nombre de ticket. select a.nom, count(t.id) as nb_ticket @@ -45,22 +25,16 @@ having count(t.id) = 72; -- 4 : Afficher le produit le plus cher et le produit le moins cher (avec leur prix). -- Pistache 63 -select article.article, prix -from article -order by prix desc -limit 1; + -- Courgette Mini Fleur 0.3 -select article.article, prix -from article -order by prix asc -limit 1; + -- ------------------------------------------------------------ -- 5a : Calculer le montant moyen d’un ticket. -- 18.84 -select avg(total_ticket) as panier_moyen +select round(avg(total_ticket),2) as panier_moyen from ( select t.id, sum(l.quantite * l.prix_unitaire) as total_ticket from ticket t @@ -70,7 +44,7 @@ from ( -- 5b : Calculer le nombre moyen d'article distinct d'un ticket. -- 6.69 -SELECT avg(nb_articles_distincts) AS moyenne_articles_distincts +SELECT round(avg(nb_articles_distincts),2) AS moyenne_articles_distincts FROM ( SELECT t.id, COUNT(DISTINCT l.article_code) AS nb_articles_distincts FROM ticket t @@ -80,7 +54,7 @@ FROM ( -- 5c Calculer le nombre moyen d'article d'un ticket. Les articles facturés au poids comptent pour 1. -- 7.21 -SELECT AVG(nb_articles) AS moyenne_articles_par_ticket +SELECT round(AVG(nb_articles),2) AS moyenne_articles_par_ticket FROM ( SELECT t.id, SUM( @@ -98,19 +72,25 @@ FROM ( -- ------------------------------------------------------------ -- 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 +select f.code, count(a.code) as nb_produits from famille f left join article a on f.code = a.famille_code -group by f.famille; +group by f.code; -- 6b --- 29 select f.famille, count(a.code) as nb_produits from famille f left join article a on f.code = a.famille_code where f.code = '02CHOU' group by f.famille; +-- 6c +select f.code, count(a.code) as nb_produits +from famille f +left join article a on f.code = a.famille_code +group by f.code +having count(a.code) <= 2; + -- 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 @@ -121,7 +101,7 @@ order by mois; -- 7b select - sum(l.quantite * l.prix_unitaire) as montant_mensuel + round(sum(l.quantite * l.prix_unitaire),2) as montant_mensuel from ticket t join ligne l on t.id = l.ticket_id where date_trunc('month', t.date_ticket) = '2016-04-01'; @@ -161,3 +141,12 @@ join article a on f.code = a.famille_code join ligne l on a.code = l.article_code group by f.code order by total_famille desc; + +-- 10b +select f.code, + round(sum(l.quantite * l.prix_unitaire),2) as total_famille +from famille f +join article a on f.code = a.famille_code +join ligne l on a.code = l.article_code +where f.code = '03FRAISE' +group by f.code diff --git a/Réponses/jointure.sql b/Réponses/11-20.sql similarity index 87% rename from Réponses/jointure.sql rename to Réponses/11-20.sql index 11fabc6..cb906dc 100644 --- a/Réponses/jointure.sql +++ b/Réponses/11-20.sql @@ -1,7 +1,4 @@ - --- ---------- - --- 1a Combien d'adhérents n’ont jamais acheté d'article ? +-- 11a Combien d'adhérents n’ont jamais acheté d'article ? -- 273 SELECT COUNT(*) AS nb_adherents_sans_achat FROM adherent a @@ -9,7 +6,7 @@ LEFT JOIN ticket t ON t.adherent_id = a.id LEFT JOIN ligne l ON l.ticket_id = t.id WHERE l.id IS NULL; --- 1b : Combien d'adhérents n’ont aucun ticket ? +-- 11b : Combien d'adhérents n’ont aucun ticket ? SELECT COUNT(*) AS nb_adherents_sans_achat FROM adherent a WHERE NOT EXISTS ( @@ -19,13 +16,13 @@ WHERE NOT EXISTS ( WHERE t.adherent_id = a.id ); --- 1c Combien de tickets sont vides (sans ligne) -SELECT t.* +-- 11c Combien de tickets sont vides (sans ligne) +SELECT count(t.*) FROM ticket t LEFT JOIN ligne l ON l.ticket_id = t.id WHERE l.id IS NULL; --- 2a Quel est l'article qui n'a jamais été commandé +-- 12a Quel est l'article qui n'a jamais été commandé SELECT a.code, a.article, a.famille_code, a.prix FROM article a WHERE NOT EXISTS ( @@ -34,18 +31,47 @@ WHERE NOT EXISTS ( WHERE l.article_code = a.code ); --- 2b +-- 12b SELECT a.code, a.article, a.famille_code FROM article a JOIN ligne l ON l.article_code = a.code GROUP BY a.code HAVING COUNT(*) = 1; --- 3 Lister les articles dont la famille est absente +-- 13 Lister les articles dont la famille est absente select a.* from article a left join famille f on f.code = a.famille_code where f.code is null +-- 14 + +SELECT + famille_code, + famille, + article_le_moins_cher, + prix_min, + article_le_plus_cher, + prix_max +FROM ( + SELECT + f.code AS famille_code, + f.famille, + ar.article AS article_le_moins_cher, + ar.prix AS prix_min, + ar2.article AS article_le_plus_cher, + ar2.prix AS prix_max, + ROW_NUMBER() OVER (PARTITION BY f.code ORDER BY ar.prix ASC) AS rn_min, + ROW_NUMBER() OVER (PARTITION BY f.code ORDER BY ar2.prix DESC) AS rn_max + FROM Famille f + JOIN Article ar ON ar.famille_code = f.code + JOIN Article ar2 ON ar2.famille_code = f.code +) sub +WHERE rn_min = 1 AND rn_max = 1; + + + +select * from article where famille_code = '03KAKI'; + -- Combien d'adhérents n’ont aucun ticket ? SELECT COUNT(*) AS nb_adherents_sans_ticket diff --git a/aggregation.md b/aggregation.md index 307a981..83fe359 100644 --- a/aggregation.md +++ b/aggregation.md @@ -7,17 +7,48 @@ Compte le nombre d'enregistrements dans un ensemble de données. ```sql -SELECT COUNT(*) FROM utilisateurs; +select count(*) from table; ``` On peut compter sur n'importe quelle colonne, dans ce cas, pour ne pas avoir à choisir on utilise le caractère joker *. +- 1 : Quel est le nombre total de ticket ? (101 616) + +```sql +select count(*) as nb_ticket from ticket; +``` + +- 2 : Quel est le nombre total d'adhérents ? (2439) + +```sql +select count(*) as nb_adherent from adherent; +``` + +- 3 : Quel est le nombre total d'articles ? (1099) + +```sql +select count(*) as nb_articles from article; +``` + +- 4 : Quel est le nombre total de familles ? (138) + +```sql +select count(*) as nb_familles from famille; +``` + ### Somme Calcule la somme des valeurs d'une colonne numérique. ```sql -SELECT SUM(salaire) FROM employes; +SELECT SUM(colonne) FROM table; +``` + +- 2 : Calculer le chiffre d’affaires global. (1 914 792.40) + +```sql +select round(sum(quantite * prix_unitaire), 2) as chiffre_affaire from ligne; +select sum(round(quantite * prix_unitaire, 2)) as chiffre_affaire from ligne; ``` ### Moyenne @@ -36,6 +67,13 @@ Retourne la valeur maximale dans une colonne. SELECT MAX(age) FROM utilisateurs; ``` +Une autre solution consiste à trier la colonne est de limiter le résultat à une seule ligne + +```sql +select article, prix from article +order by prix desc limit 1; +``` + ### Minimum Retourne la valeur minimale dans une colonne. @@ -44,6 +82,13 @@ Retourne la valeur minimale dans une colonne. SELECT MIN(age) FROM utilisateurs; ``` +Une autre solution consiste à trier la colonne est de limiter le résultat à une seule ligne + +```sql +select article, prix from article +order by prix asc limit 1; +``` + ### Filtre après agrégation `HAVING` est emblable à `WHERE`, mais utilisé pour filtrer les résultats des fonctions d'agrégation **après** un `GROUP BY`.