From f067959843a07401cf53d0670a6a34050fcf406c Mon Sep 17 00:00:00 2001 From: medina5 Date: Thu, 28 Aug 2025 07:13:19 +0200 Subject: [PATCH] Exercice 2 --- .gitignore | 1 + README.md | 2 +- ToDo.md | 5 +++ compose.yaml | 4 +- docker-entrypoint-initdb.d/initdb.sql | 48 ++++++++++++++++++++ exercice.md | 63 -------------------------- exercices.md | 65 +++++++++++++++++++++++++++ 7 files changed, 122 insertions(+), 66 deletions(-) create mode 100644 .gitignore create mode 100644 ToDo.md delete mode 100644 exercice.md create mode 100644 exercices.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1708086 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/reponses.sql diff --git a/README.md b/README.md index 8ebd7bd..74da26e 100644 --- a/README.md +++ b/README.md @@ -46,4 +46,4 @@ SELECT MIN(age) FROM utilisateurs; ### 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 des fonctions d'agrégation **après** un `GROUP BY`. diff --git a/ToDo.md b/ToDo.md new file mode 100644 index 0000000..46e7561 --- /dev/null +++ b/ToDo.md @@ -0,0 +1,5 @@ +28/08 +- Export des familles en triant par code +- Guillemets autour du nom des articles car présence de virgule +- Nom des fichiers d'import identique aux noms des tables +- Convention de nommage diff --git a/compose.yaml b/compose.yaml index 4db7aec..9e74aa1 100644 --- a/compose.yaml +++ b/compose.yaml @@ -8,8 +8,8 @@ services: POSTGRES_USER: ${COMPOSE_PROJECT_NAME} volumes: - database_data:/var/lib/postgresql/data:rw - - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d - - ./data:/tmp + - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d:Z + - ./data:/tmp:Z ports: - 5432:5432 diff --git a/docker-entrypoint-initdb.d/initdb.sql b/docker-entrypoint-initdb.d/initdb.sql index e69de29..40c7343 100644 --- a/docker-entrypoint-initdb.d/initdb.sql +++ b/docker-entrypoint-initdb.d/initdb.sql @@ -0,0 +1,48 @@ +create table famille ( + famille text primary key, + intitule text, + type int, + unite int +); + +\COPY famille FROM '/tmp/famille.csv' (FORMAT CSV, header, ENCODING 'UTF8'); + +create table article ( + code text primary key, + edi text, + stat1 text, + stat2 text, + article text, + famille text, -- references famille(famille) + factpoids int, + unitevente int, + prix decimal, + unitepoids int, + publie int, + suivistock int, + sommeil int +); + +\COPY article FROM '/tmp/articles.csv' (FORMAT CSV, header, ENCODING 'UTF8'); + +create table ticket ( + id int primary key, + horodatage timestamp, + client text, + mode_rglt int, + etat int, + facture text +); + +\COPY ticket FROM '/tmp/tickets.csv' (FORMAT CSV, header, ENCODING 'UTF8'); + +create table ligne ( + id int primary key, + ticket_id int, --references ticket (id), + article text, -- references article (code) + prix_unitaire decimal, + quantite decimal, + total decimal +); + +\COPY ligne FROM '/tmp/lignes.csv' (FORMAT CSV, header, ENCODING 'UTF8'); diff --git a/exercice.md b/exercice.md deleted file mode 100644 index 85fd751..0000000 --- a/exercice.md +++ /dev/null @@ -1,63 +0,0 @@ -# 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 - -## Environnement - -### Construire l'image - -```shell -docker build -t iut/pgsql:2025-08 . -``` - -## 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/exercices.md b/exercices.md new file mode 100644 index 0000000..903c215 --- /dev/null +++ b/exercices.md @@ -0,0 +1,65 @@ +# 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 + +## Environnement + +### Construire l'image + +```shell +docker build -t iut/pgsql:2025-08 . +``` + +## Serie 1 + +- 1 : Quel est le nombre total de tickets enregistrés dans la base ? +- 2 : Calculer le chiffre d’affaires global. +- 3 : Pour chaque client, afficher son nom et le nombre de tickets qu’il a effectués. +- 4 : Calculer le montant moyen d’un ticket (total ventes ÷ nombre de tickets). +- 5 : Afficher le produit le plus cher et le produit le moins cher (avec leur prix). +- 6 : Pour chaque famille de produits, afficher le nom de la famille et le nombre de produits associés. +- 7 : Afficher, pour chaque mois, le chiffre d’affaires réalisé. +- 8 : Trouver le client qui a dépensé le plus en montant total. +- 9 : Afficher le produit ayant généré le plus de ventes en quantité totale vendue. +- 10 : Pour chaque famille, afficher le montant total des ventes. + +## Série 2 + +- 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. +- 4 : Lister tous les clients et tous les tickets, même si la correspondance n’existe pas. Union des clients sans tickets et des tickets sans clients. +- 5 : Lister uniquement les clients qui ont acheté au moins un produit. +- 6 : Lister les clients qui n’ont jamais acheté de produit. +- 7 : Lister les produits avec leur famille, même si certains produits n’ont pas de famille renseignée. +- 8 : Lister tous les couples de clients qui habitent dans la même ville. +- 9 : Lister toutes les combinaisons possibles de familles et de clients (sans condition de jointure). +- 10 : Lister les tickets contenant au moins un produit de la famille "Boissons". + + +Exercice — CROSS JOIN +Lister toutes les combinaisons possibles Client × Famille (même si elles n’existent pas en vrai). + +Exercice 7 — Agrégation + JOIN +Pour chaque famille de produits, calculer le montant total des ventes. + +Exercice 8 — SELF JOIN +Lister les couples de clients qui ont acheté au moins un produit en commun. + +Exercice 9 — Jointure imbriquée +Lister les clients qui ont acheté des produits d’une famille donnée (ex: "Boissons"). + +Exercice 10 — Différence d’ensembles +Lister les clients qui n’ont jamais acheté de produit d’une famille donnée. + +Exercice 11 — Différence d’ensembles (ANTI-JOIN) — clients n’ayant jamais acheté cette famille