Questions agrégation
@@ -1,13 +1,6 @@
|
|||||||
# Exercices
|
# 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.
|
- 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).
|
- 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.
|
- 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.
|
||||||
|
|||||||
16
Home.md
16
Home.md
@@ -10,11 +10,6 @@
|
|||||||
|
|
||||||
Arrondir les montant à deux chiffres après la virgule.
|
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.
|
- 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)
|
- 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)
|
- 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)
|
- 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.
|
- 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)
|
- 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é.
|
- 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)
|
- 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)
|
- 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.
|
- 10a : Pour chaque famille, afficher le montant total des ventes.
|
||||||
- 10b : Quel est le montant total des ventes de la famille 03FRAISE. (10368.69)
|
- 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 ?
|
- 11a : Combien d'adhérents n’ont jamais acheté d'article ? (273)
|
||||||
- 11b : Combien d'adhérents n’ont aucun ticket ?
|
- 11b : Combien d'adhérents n’ont aucun ticket ? (261)
|
||||||
- 11c : Combien de tickets sont vides (sans ligne)
|
- 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)
|
- 20 : Quel adhérent est en double (même nom, prénom, date de naissance)
|
||||||
|
|||||||
@@ -1,25 +1,5 @@
|
|||||||
-- Réponses questions de 1 à 10
|
-- 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.
|
-- 3a : Pour chaque adhérent unique, afficher son nom et son nombre de ticket.
|
||||||
select a.nom,
|
select a.nom,
|
||||||
count(t.id) as nb_ticket
|
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).
|
-- 4 : Afficher le produit le plus cher et le produit le moins cher (avec leur prix).
|
||||||
-- Pistache 63
|
-- Pistache 63
|
||||||
select article.article, prix
|
|
||||||
from article
|
|
||||||
order by prix desc
|
|
||||||
limit 1;
|
|
||||||
|
|
||||||
-- Courgette Mini Fleur 0.3
|
-- 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.
|
-- 5a : Calculer le montant moyen d’un ticket.
|
||||||
-- 18.84
|
-- 18.84
|
||||||
select avg(total_ticket) as panier_moyen
|
select round(avg(total_ticket),2) as panier_moyen
|
||||||
from (
|
from (
|
||||||
select t.id, sum(l.quantite * l.prix_unitaire) as total_ticket
|
select t.id, sum(l.quantite * l.prix_unitaire) as total_ticket
|
||||||
from ticket t
|
from ticket t
|
||||||
@@ -70,7 +44,7 @@ from (
|
|||||||
|
|
||||||
-- 5b : Calculer le nombre moyen d'article distinct d'un ticket.
|
-- 5b : Calculer le nombre moyen d'article distinct d'un ticket.
|
||||||
-- 6.69
|
-- 6.69
|
||||||
SELECT avg(nb_articles_distincts) AS moyenne_articles_distincts
|
SELECT round(avg(nb_articles_distincts),2) AS moyenne_articles_distincts
|
||||||
FROM (
|
FROM (
|
||||||
SELECT t.id, COUNT(DISTINCT l.article_code) AS nb_articles_distincts
|
SELECT t.id, COUNT(DISTINCT l.article_code) AS nb_articles_distincts
|
||||||
FROM ticket t
|
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.
|
-- 5c Calculer le nombre moyen d'article d'un ticket. Les articles facturés au poids comptent pour 1.
|
||||||
-- 7.21
|
-- 7.21
|
||||||
SELECT AVG(nb_articles) AS moyenne_articles_par_ticket
|
SELECT round(AVG(nb_articles),2) AS moyenne_articles_par_ticket
|
||||||
FROM (
|
FROM (
|
||||||
SELECT t.id,
|
SELECT t.id,
|
||||||
SUM(
|
SUM(
|
||||||
@@ -98,19 +72,25 @@ FROM (
|
|||||||
-- ------------------------------------------------------------
|
-- ------------------------------------------------------------
|
||||||
|
|
||||||
-- 6a : Pour chaque famille, afficher le nom de la famille et le nombre d'articles associés.
|
-- 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
|
from famille f
|
||||||
left join article a on f.code = a.famille_code
|
left join article a on f.code = a.famille_code
|
||||||
group by f.famille;
|
group by f.code;
|
||||||
|
|
||||||
-- 6b
|
-- 6b
|
||||||
-- 29
|
|
||||||
select f.famille, count(a.code) as nb_produits
|
select f.famille, count(a.code) as nb_produits
|
||||||
from famille f
|
from famille f
|
||||||
left join article a on f.code = a.famille_code
|
left join article a on f.code = a.famille_code
|
||||||
where f.code = '02CHOU'
|
where f.code = '02CHOU'
|
||||||
group by f.famille;
|
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é.
|
-- 7 : Afficher, pour chaque mois, le chiffre d’affaires réalisé.
|
||||||
select date_trunc('month', t.date_ticket) as mois,
|
select date_trunc('month', t.date_ticket) as mois,
|
||||||
sum(l.quantite * l.prix_unitaire) as montant_mensuel
|
sum(l.quantite * l.prix_unitaire) as montant_mensuel
|
||||||
@@ -121,7 +101,7 @@ order by mois;
|
|||||||
|
|
||||||
-- 7b
|
-- 7b
|
||||||
select
|
select
|
||||||
sum(l.quantite * l.prix_unitaire) as montant_mensuel
|
round(sum(l.quantite * l.prix_unitaire),2) as montant_mensuel
|
||||||
from ticket t
|
from ticket t
|
||||||
join ligne l on t.id = l.ticket_id
|
join ligne l on t.id = l.ticket_id
|
||||||
where date_trunc('month', t.date_ticket) = '2016-04-01';
|
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
|
join ligne l on a.code = l.article_code
|
||||||
group by f.code
|
group by f.code
|
||||||
order by total_famille desc;
|
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
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
|
-- 11a Combien d'adhérents n’ont jamais acheté d'article ?
|
||||||
-- ----------
|
|
||||||
|
|
||||||
-- 1a Combien d'adhérents n’ont jamais acheté d'article ?
|
|
||||||
-- 273
|
-- 273
|
||||||
SELECT COUNT(*) AS nb_adherents_sans_achat
|
SELECT COUNT(*) AS nb_adherents_sans_achat
|
||||||
FROM adherent a
|
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
|
LEFT JOIN ligne l ON l.ticket_id = t.id
|
||||||
WHERE l.id IS NULL;
|
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
|
SELECT COUNT(*) AS nb_adherents_sans_achat
|
||||||
FROM adherent a
|
FROM adherent a
|
||||||
WHERE NOT EXISTS (
|
WHERE NOT EXISTS (
|
||||||
@@ -19,13 +16,13 @@ WHERE NOT EXISTS (
|
|||||||
WHERE t.adherent_id = a.id
|
WHERE t.adherent_id = a.id
|
||||||
);
|
);
|
||||||
|
|
||||||
-- 1c Combien de tickets sont vides (sans ligne)
|
-- 11c Combien de tickets sont vides (sans ligne)
|
||||||
SELECT t.*
|
SELECT count(t.*)
|
||||||
FROM ticket t
|
FROM ticket t
|
||||||
LEFT JOIN ligne l ON l.ticket_id = t.id
|
LEFT JOIN ligne l ON l.ticket_id = t.id
|
||||||
WHERE l.id IS NULL;
|
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
|
SELECT a.code, a.article, a.famille_code, a.prix
|
||||||
FROM article a
|
FROM article a
|
||||||
WHERE NOT EXISTS (
|
WHERE NOT EXISTS (
|
||||||
@@ -34,18 +31,47 @@ WHERE NOT EXISTS (
|
|||||||
WHERE l.article_code = a.code
|
WHERE l.article_code = a.code
|
||||||
);
|
);
|
||||||
|
|
||||||
-- 2b
|
-- 12b
|
||||||
SELECT a.code, a.article, a.famille_code
|
SELECT a.code, a.article, a.famille_code
|
||||||
FROM article a
|
FROM article a
|
||||||
JOIN ligne l ON l.article_code = a.code
|
JOIN ligne l ON l.article_code = a.code
|
||||||
GROUP BY a.code
|
GROUP BY a.code
|
||||||
HAVING COUNT(*) = 1;
|
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
|
select a.* from article a
|
||||||
left join famille f on f.code = a.famille_code
|
left join famille f on f.code = a.famille_code
|
||||||
where f.code is null
|
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 ?
|
-- Combien d'adhérents n’ont aucun ticket ?
|
||||||
|
|
||||||
SELECT COUNT(*) AS nb_adherents_sans_ticket
|
SELECT COUNT(*) AS nb_adherents_sans_ticket
|
||||||
@@ -7,17 +7,48 @@
|
|||||||
Compte le nombre d'enregistrements dans un ensemble de données.
|
Compte le nombre d'enregistrements dans un ensemble de données.
|
||||||
|
|
||||||
```sql
|
```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 *.
|
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
|
### Somme
|
||||||
|
|
||||||
Calcule la somme des valeurs d'une colonne numérique.
|
Calcule la somme des valeurs d'une colonne numérique.
|
||||||
|
|
||||||
```sql
|
```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
|
### Moyenne
|
||||||
@@ -36,6 +67,13 @@ Retourne la valeur maximale dans une colonne.
|
|||||||
SELECT MAX(age) FROM utilisateurs;
|
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
|
### Minimum
|
||||||
|
|
||||||
Retourne la valeur minimale dans une colonne.
|
Retourne la valeur minimale dans une colonne.
|
||||||
@@ -44,6 +82,13 @@ Retourne la valeur minimale dans une colonne.
|
|||||||
SELECT MIN(age) FROM utilisateurs;
|
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
|
### 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`.
|
`HAVING` est emblable à `WHERE`, mais utilisé pour filtrer les résultats des fonctions d'agrégation **après** un `GROUP BY`.
|
||||||
|
|||||||
Reference in New Issue
Block a user