ParcoursOuvrir l'appli

Résumer : GROUP BY

SQL et bases de données · 45 min

Les fonctions d'agrégation

Fonction Résultat
COUNT(*) le nombre de lignes
SUM(colonne) la somme
AVG(colonne) la moyenne (average)
MIN(colonne), MAX(colonne) le plus petit, le plus grand
ROUND(x) arrondit ; ROUND(x, 2) à 2 chiffres après la virgule
SELECT COUNT(*), SUM(quantite * prix_unitaire)
FROM ventes;

Résultat : une seule ligne, (42, 142050). Tout le chiffre d'affaires du projet, en une requête.

GROUP BY

SELECT produit, SUM(quantite * prix_unitaire) AS ca
FROM ventes
GROUP BY produit
ORDER BY ca DESC;

WHERE ou HAVING ?

SELECT vendeur, COUNT(*) AS n
FROM ventes
WHERE produit = 'riz'        -- seulement les ventes de riz
GROUP BY vendeur
HAVING n >= 5;               -- seulement les vendeurs qui en ont fait au moins 5

-- commence un commentaire en SQL, comme # en Python.

L'ordre complet devient :

SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT ...;

Exercice : Le résumé en une ligne

Écris une requête qui renvoie, sur une seule ligne : le nombre de ventes, le chiffre d'affaires total, et le panier moyen arrondi à l'entier (ROUND de la moyenne des montants).

Voir une solution
import sqlite3

conn = sqlite3.connect(":memory:")
conn.executescript(open("boutique.sql", encoding="utf-8").read())

requete = """
SELECT COUNT(*), SUM(quantite * prix_unitaire), ROUND(AVG(quantite * prix_unitaire))
FROM ventes
"""
resultat = conn.execute(requete).fetchall()
for ligne in resultat:
    print(ligne)

Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice

Exercice : Le chiffre d'affaires par mois

Écris une requête qui donne, pour chaque mois, le mois (AAAA-MM) et le chiffre d'affaires, dans l'ordre des mois.

Voir une solution
import sqlite3

conn = sqlite3.connect(":memory:")
conn.executescript(open("boutique.sql", encoding="utf-8").read())

requete = """
SELECT substr(date, 1, 7) AS mois, SUM(quantite * prix_unitaire)
FROM ventes
GROUP BY mois
ORDER BY mois
"""
resultat = conn.execute(requete).fetchall()
for ligne in resultat:
    print(ligne)

Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice

Exercice : Les vendeurs les plus actifs

Écris une requête qui donne le nom et le nombre de ventes de chaque vendeur qui a fait au moins 13 ventes, du plus actif au moins actif.

Voir une solution
import sqlite3

conn = sqlite3.connect(":memory:")
conn.executescript(open("boutique.sql", encoding="utf-8").read())

requete = """
SELECT vendeur, COUNT(*) AS n
FROM ventes
GROUP BY vendeur
HAVING n >= 13
ORDER BY n DESC
"""
resultat = conn.execute(requete).fetchall()
for ligne in resultat:
    print(ligne)

Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice

Teste-toi

On veut les produits dont le chiffre d'affaires dépasse 30 000 FCFA. Où se place la condition ?
  1. WHERE SUM(quantite * prix_unitaire) > 30000
  2. HAVING SUM(quantite * prix_unitaire) > 30000, après GROUP BY produit (bonne réponse)
  3. ORDER BY 30000
  4. LIMIT 30000