Environnement Docker et exercices
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# Fonctions d'agrégation
|
# 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
|
### Compter
|
||||||
|
|
||||||
@@ -44,6 +44,6 @@ Retourne la valeur minimale dans une colonne.
|
|||||||
SELECT MIN(age) FROM utilisateurs;
|
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.
|
||||||
|
|||||||
22
compose.yaml
Normal file
22
compose.yaml
Normal file
@@ -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:
|
||||||
55
exercice.md
Normal file
55
exercice.md
Normal file
@@ -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.
|
||||||
0
initdb.sql
Normal file
0
initdb.sql
Normal file
44
pgsql/Dockerfile
Normal file
44
pgsql/Dockerfile
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user