From 380d9e5e9fdb3e38a2e4b75a7915e1c8b33d5b3e Mon Sep 17 00:00:00 2001 From: medina5 Date: Wed, 27 Aug 2025 07:51:06 +0200 Subject: [PATCH] Environnement Docker et exercices --- README.md | 6 +++--- compose.yaml | 22 +++++++++++++++++++ exercice.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ initdb.sql | 0 pgsql/Dockerfile | 44 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 compose.yaml create mode 100644 exercice.md create mode 100644 initdb.sql create mode 100644 pgsql/Dockerfile diff --git a/README.md b/README.md index 8656023..8ebd7bd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Fonctions d'agrégation -> En SQL, une agrégation est une opération qui permet de combiner plusieurs valeurs de données en une seule valeur résumée. Les opérations d'agrégation sont souvent utilisées en combinaison avec la clause GROUP BY pour regrouper les données selon des critères spécifiques avant de les résumer. +> En SQL, une agrégation est une opération qui permet de combiner plusieurs valeurs de données en une seule valeur résumée. Les opérations d'agrégation sont souvent utilisées en combinaison avec la clause `GROUP BY` pour regrouper les données selon des critères spécifiques avant de les résumer. ### Compter @@ -44,6 +44,6 @@ Retourne la valeur minimale dans une colonne. SELECT MIN(age) FROM utilisateurs; ``` -### Filtre après aggrégation +### Filtre après agrégation -HAVING est emblable à WHERE, mais utilisé pour filtrer les résultats après un GROUP BY, sur les résultats des fonctions d'agrégation. +HAVING est emblable à WHERE, mais utilisé pour filtrer les résultats **après** un GROUP BY, sur les résultats des fonctions d'agrégation. diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..65f47da --- /dev/null +++ b/compose.yaml @@ -0,0 +1,22 @@ +services: + database: + image: pgsql:2025.09 + build: + context: ./pgsql + environment: + POSTGRES_INITDB_ARGS: "--locale-provider=icu --icu-locale=fr-FR" + POSTGRES_DB: ${COMPOSE_PROJECT_NAME} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-!ChangeMe!} + POSTGRES_USER: ${COMPOSE_PROJECT_NAME} + healthcheck: + test: ["CMD", "pg_isready", "-d", "${COMPOSE_PROJECT_NAME}", "-U", "${COMPOSE_PROJECT_NAME}"] + timeout: 5s + retries: 5 + start_period: 20s + volumes: + - database_data:/var/lib/postgresql/data:rw + - ./pgsql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d + - ./pgsql/data:/tmp + +volumes: + database_data: diff --git a/exercice.md b/exercice.md new file mode 100644 index 0000000..46e9218 --- /dev/null +++ b/exercice.md @@ -0,0 +1,55 @@ +# Exercices + +## Schéma + +Clients : id_client, nom, ville + +Familles : id_famille, nom_famille + +Produits : id_produit, nom_produit, prix_unitaire, id_famille + +Tickets : id_ticket, date_vente, id_client + +LignesTicket : id_ligne, id_ticket, id_produit, quantite, prix_unitaire + +## Questions + +### Exercice 1 : Nombre total de tickets + +Trouver le nombre total de tickets enregistrés dans la base. + +### Exercice 2 : Montant total des ventes + +Calculer le chiffre d’affaires global (somme de quantite * prix_unitaire). + +### Exercice 3 : Nombre de tickets par client + +Pour chaque client, afficher son nom et le nombre de tickets qu’il a effectués. + +### Exercice 4 : Panier moyen + +Calculer le montant moyen d’un ticket (total ventes ÷ nombre de tickets). + +### Exercice 5 : Produit le plus cher et le moins cher + +Afficher le produit le plus cher et le produit le moins cher (avec leur prix). + +### Exercice 6 : Familles de produits et nombre de produits + +Pour chaque famille de produits, afficher le nom de la famille et le nombre de produits associés. + +### Exercice 7 : Ventes par mois + +Afficher, pour chaque mois, le chiffre d’affaires réalisé. + +### Exercice 8 : Meilleur client + +Trouver le client qui a dépensé le plus en montant total. + +### Exercice 9 : Produit le plus vendu + +Afficher le produit ayant généré le plus de ventes en quantité totale vendue. + +### Exercice 10 : Répartition des ventes par famille + +Pour chaque famille, afficher le montant total des ventes. diff --git a/initdb.sql b/initdb.sql new file mode 100644 index 0000000..e69de29 diff --git a/pgsql/Dockerfile b/pgsql/Dockerfile new file mode 100644 index 0000000..3bffbf3 --- /dev/null +++ b/pgsql/Dockerfile @@ -0,0 +1,44 @@ +# Étape 1 : builder temporaire pour compiler pgTAP +FROM debian:trixie AS builder + +# Installer les outils nécessaires pour compiler pgTAP +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + git \ + build-essential \ + ca-certificates \ + postgresql-server-dev-17 \ + make + +# Cloner et compiler pgTAP +RUN git clone --depth 1 https://github.com/theory/pgtap.git /usr/src/pgtap && \ + cd /usr/src/pgtap && \ + make && \ + make install DESTDIR=/pgtap-dist + +# Étape 2 : image finale PostgreSQL propre +FROM postgres:17.5 + +RUN set -eux; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + locales; \ + sed -i '/fr_FR.UTF-8/s/^# //' /etc/locale.gen; \ + locale-gen + +ENV TZ Europe/Paris +ENV LANG=fr_FR.UTF-8 +ENV LANGUAGE=fr_FR:fr +ENV LC_ALL=fr_FR.UTF-8 + +RUN set -eux; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + postgresql-postgis + +# Copier uniquement les fichiers installés depuis le builder +COPY --from=builder /pgtap-dist/ / + +# Scripts init et données +COPY ./docker-entrypoint-initdb.d /docker-entrypoint-initdb.d +COPY ./data /tmp