From 3b8f95e823807af2f280a26e6b9745325e76ce63 Mon Sep 17 00:00:00 2001 From: medina5 Date: Fri, 14 Nov 2025 07:32:20 +0100 Subject: [PATCH] vues --- banque.md | 152 ++++++++++++++++++++++++++++++++++++++++ banque/banque.4.sql | 9 +++ banque/groupe1/data.sql | 141 +++++++++++++++++++++++++++---------- 3 files changed, 264 insertions(+), 38 deletions(-) create mode 100644 banque/banque.4.sql diff --git a/banque.md b/banque.md index 73a2d0b..878e693 100644 --- a/banque.md +++ b/banque.md @@ -664,3 +664,155 @@ create table operation ( "direction" text check (direction in ('DEBIT', 'CREDIT')) ); ``` + +# Séance 3 : Exploitation des données + +Créer des vues pour + +## **1. Vue : liste des titulaires détaillés** + +Créer une vue *holder_details* permettant d’afficher **tous les titulaires** (banque, personne ou entreprise) sous une forme unifiée. + +La vue doit contenir : + +* l’identifiant du titulaire +* son type +* un champ `display_name` calculé ainsi : + + * pour un titulaire de type *PERSON* : *firstname lastname* + * pour un titulaire de type *COMPANY* : *name* + * pour un titulaire de type *BANK* : *name* + +## **2. Vue : liste des comptes avec devise et solde** + +Créer une vue *account_summary* affichant : + +* l’identifiant du compte +* la date d’ouverture +* la devise +* le solde +* le nombre de titulaires du compte + +## **3. Vue : comptes par titulaire** + +Créer une vue *holder_accounts* permettant de lister les comptes détenus par chaque titulaire, avec : + +* le titulaire (id et type) +* le nom du titulaire +* l’identifiant du compte +* la part détenue (`share`) +* le solde total du compte + +La vue doit fusionner les informations venant de **holder, person et company**. + +## **4. Vue : opérations enrichies** + +Créer une vue *operation_details* affichant les opérations avec : + +* la date de l’opération +* le compte impacté +* la direction (DEBIT ou CREDIT) +* le montant de l’opération +* le montant signé (crédit positif, débit négatif) +* le solde du compte **après l’opération** (bonus : fenêtre analytique) + +> Cet exercice introduit les **fenêtres SQL** (`sum() over (...)`). + +## **5. Vue : taux de change du jour** + +Créer une vue *today_exchange_rates* qui affiche pour **chaque devise** son taux de change du jour présent dans `exchange_rate`. + +Si aucun taux du jour n’existe, la ligne ne doit pas apparaître. + +## **6. Vue : solde converti en EUR** + +Créer une vue *account_balance_eur* pour afficher : + +* compte +* devise d’origine +* solde original +* taux de change correspondant à la date du jour +* solde converti en EUR (solde × taux) + +> Supposer que *EUR* est toujours présent dans la table `currency`. + +## **7. Vue : transactions complètes** + +Créer une vue *transaction_summary* affichant un regroupement par transaction : + +* id de la transaction +* date +* montant total de la transaction (somme des opérations) +* liste des comptes concernés (optionnel : concaténation) + +## **8. Vue : comptes en découvert imminent** + +Créer une vue *accounts_at_risk* listant les comptes dont le solde est inférieur à 50 (dans leur devise), ou qui auraient un solde négatif s'ils effectuaient un débit supplémentaire de 20. + +> Vérification simple : `balance - 20 < 0 OR balance < 50`. + +## **9. Vue : âge des personnes** + +Créer une vue *person_age* indiquant : + +* id +* nom complet +* date de naissance +* âge en années (utiliser `age()`) + +## **10. Vue : répartition des parts d’un compte** + +Créer une vue *account_shares* affichant : + +* id du compte +* nombre de titulaires +* somme des parts +* une colonne booléenne `is_valid` vérifiant si la somme = 1 + +> Objectif : vérifier que les parts des comptes joints sont bien réparties. + +## **11. Vue : solde par titulaire** + +Créer une vue *holder_total_balance* indiquant pour chaque titulaire : + +* id +* type +* nom +* somme des soldes de tous ses comptes (pondérée par `share`), calcul : + `total = SUM(share × balance)` + +## **12. Vue : opérations d’un compte en sens unique** + +Créer une vue *account_debits* listant uniquement les opérations de type DEBIT, avec : + +* date +* compte +* montant négatif + +Créer une seconde vue *account_credits* (montants positifs). + +## **13. Vue : dernier taux connu pour chaque devise** + +Créer une vue *latest_exchange_rate* qui donne, pour chaque devise, son taux de change le plus récent : + +* joindre avec une sous-requête récupérant `max(date)` pour chaque devise. + +## **14. Vue : liste des entreprises avec ancienneté** + +Créer une vue *company_age* indiquant : + +* id +* name +* registration_number +* age de l’entreprise en années (`age(current_date, created_at)`) + +## **15. Vue : recapitulatif bancaire complet** + +Créer une vue *bank_overview* qui croise : + +* les titulaires +* leurs comptes +* leurs transactions +* leurs opérations + +But : proposer une vue permettant d’obtenir le *“mini bilan"* d’un titulaire. diff --git a/banque/banque.4.sql b/banque/banque.4.sql new file mode 100644 index 0000000..239aaa5 --- /dev/null +++ b/banque/banque.4.sql @@ -0,0 +1,9 @@ +select h.id, h.type, case h.type + when 'PERSON' then p.firstname || ' ' || p.lastname + when 'COMPANY' then c.name + when 'BANK' then b.name +end +from holder h + left join person p on p.id = h.id + left join company c on c.id = h.id + left join bank b on b.id = h.id \ No newline at end of file diff --git a/banque/groupe1/data.sql b/banque/groupe1/data.sql index 1652141..0719b11 100644 --- a/banque/groupe1/data.sql +++ b/banque/groupe1/data.sql @@ -11,49 +11,114 @@ update account set balance = 100000 where id = 1; update account set balance = 50000 where id = 2; update account set balance = 200000 where id = 3; -call add_person('Albane','Trottier', '1990-01-01', array['USD']); -call add_person('Josef','Jakubowski', '1990-01-01',array['EUR', 'EUR']); -call add_person('Ali','Sahim', '1990-01-01', array['EUR']); -call add_person('Émilie','Jolie', '1990-01-01', array['EUR']); -call add_person('Soufiane','Mamoun', '1990-01-01',array['EUR', 'EUR']); -call add_person('Élodie','Bérengier', '1990-01-01',array['EUR', 'EUR']); -call add_person('Eugène','Makiadi', '1990-01-01', array['EUR']); -call add_person('Julie','Thomis', '1990-01-01',array['EUR', 'EUR', 'EUR']); -call add_person('Marc','Aurèle', '1990-01-01',array['USD', 'EUR', 'EUR']); -call add_person('Albert','Unepierre', '1990-01-01', array['EUR']); -call add_person('Lucas','George', '1990-01-01', array['EUR']); -call add_person('Lyna','Khoudri', '1990-01-01',array['EUR', 'USD']); -call add_person('Nour','Zermani', '1990-01-01', array['USD']); -call add_person('Théophile','M''Beko', '1990-01-01',array['EUR', 'USD']); -call add_person('Sébastien','Voltier', '1990-01-01', array['EUR']); -call add_person('Matteo','Giordano', '1990-01-01',array['EUR', 'USD']); -call add_person('Diego','Delavega', '1990-01-01',array['EUR', 'EUR', 'EUR']); +insert into exchange_rate values +('EUR', '1999-01-01', 1), +('USD', '2025-01-02', 1.0321), +('USD', '2025-02-03', 1.0274), +('USD', '2025-03-03', 1.0465); + +call add_person('Albane','Trottier', '1987-01-01', array['USD']); +call add_person('Josef','Jakubowski', '1988-01-01',array['EUR', 'EUR']); +call add_person('Ali','Sahim', '1989-01-01', array['EUR']); +call add_person('Émilie','Jolie', '1992-01-01', array['EUR']); +call add_person('Soufiane','Mamoun', '1993-01-01',array['EUR', 'EUR']); +call add_person('Élodie','Bérengier', '1991-01-01',array['EUR', 'EUR']); +call add_person('Eugène','Makiadi', '1994-01-01', array['EUR']); +call add_person('Julie','Thomis', '1980-01-01',array['EUR', 'EUR', 'EUR']); +call add_person('Marc','Aurèle', '1981-01-01',array['USD', 'EUR', 'EUR']); +call add_person('Albert','Unepierre', '1982-01-01', array['EUR']); +call add_person('Lucas','George', '1978-01-01', array['EUR']); +call add_person('Lyna','Khoudri', '1983-01-01',array['EUR', 'USD']); +call add_person('Nour','Zermani', '1984-01-01', array['USD']); +call add_person('Théophile','M''Beko', '1985-01-01',array['EUR', 'USD']); +call add_person('Sébastien','Voltier', '1986-01-01', array['EUR']); +call add_person('Matteo','Giordano', '1985-01-01',array['EUR', 'USD']); +call add_person('Diego','Delavega', '1977-01-01',array['EUR', 'EUR', 'EUR']); call add_person('Geoffrey','Lebowski', '1990-01-01',array['EUR', 'EUR', 'EUR']); -call add_person('Ælita','Dornburg', '1990-01-01',array['EUR', 'USD']); -call add_person('João','Costa', '1990-01-01',array['EUR']); +call add_person('Ælita','Dornburg', '1991-01-01',array['EUR', 'USD']); +call add_person('João','Costa', '1978-01-01',array['EUR']); call add_person('Maëla','Le Roux', '1990-01-01',array['EUR']); -call add_person('Rose-Lynn','Noël', '1990-01-01',array['EUR']); +call add_person('Rose-Lynn','Noël', '1986-01-01',array['EUR']); call add_person('Jean-Christophe','Prigent', '1990-01-01',array['EUR','USD']); -call add_person('Apolline','de Bazelaire de Lesseux', '1990-01-01',array['EUR']); -call add_person('Aylin','Özkan', '1990-01-01',array['EUR', 'EUR', 'EUR']); -call add_person('Yana','Zhdanova', '1988-02-28',array['EUR', 'EUR']); -call add_person('Nayiri','Zakarian', '1990-01-01',array['EUR', 'EUR']); +call add_person('Apolline','de Bazelaire de Lesseux', '1984-01-01',array['EUR']); +call add_person('Aylin','Özkan', '1985-01-01',array['EUR', 'EUR', 'EUR']); +call add_person('Yana','Zhdanova', '1993-02-28',array['EUR', 'EUR']); +call add_person('Nayiri','Zakarian', '1996-01-01',array['EUR', 'EUR']); call add_person('François','du Bessey de Contenson', '1990-01-01', array['USD', 'EUR', 'EUR']); call add_person('Martial','Mondésir', '1990-01-01', array['EUR', 'EUR', 'EUR']); -call add_person('Tom','Kishida', '1990-01-01',array['EUR', 'EUR']); -call add_person('Zainap','Bisliev', '1990-01-01',array['EUR']); -call add_person('Maï Ly','Pham Le', '1990-01-01',array['EUR', 'EUR']); -call add_person('Laurent','Ramasawmy', '1990-01-01',array['EUR']); -call add_person('Atika','Mroudjaé', '1990-01-01',array['EUR', 'EUR', 'EUR']); +call add_person('Tom','Kishida', '1995-01-01',array['EUR', 'EUR']); +call add_person('Zainap','Bisliev', '1997-01-01',array['EUR']); +call add_person('Maï Ly','Pham Le', '1999-01-01',array['EUR', 'EUR']); +call add_person('Laurent','Ramasawmy', '1993-01-01',array['EUR']); +call add_person('Atika','Mroudjaé', '1994-01-01',array['EUR', 'EUR', 'EUR']); call add_person('Alice','Inechains', '1987-07-07',array['EUR']); -call add_person('Laureline','Mézières', '1990-01-01',array['EUR', 'USD']); -call add_person('Valerian','Christin', '1990-01-01',array['EUR', 'EUR', 'USD']); -call add_person('Alice','Kingsleigh', '1990-01-01',array['EUR', 'USD', 'EUR']); -call add_person('Amélie','Pond', '1990-01-01',array['EUR', 'EUR', 'EUR']); -call add_person('Eyota','Olmsted', '1990-01-01',array['EUR', 'EUR']); -call add_person('Hapsatou','Sall','1990-01-01'); -call add_person('Arthur','Koblenz','1990-01-01'); -call add_person('Ellen Louise','Ripley','1990-01-01'); +call add_person('Laureline','Mézières', '1986-01-01',array['EUR', 'USD']); +call add_person('Valerian','Christin', '1987-01-01',array['EUR', 'EUR', 'USD']); +call add_person('Alice','Kingsleigh', '1981-01-01',array['EUR', 'USD', 'EUR']); +call add_person('Amélie','Pond', '1998-01-01',array['EUR', 'EUR', 'EUR']); +call add_person('Eyota','Olmsted', '1992-01-01',array['EUR', 'EUR']); +call add_person('Hapsatou','Sall','1982-01-01'); +call add_person('Arthur','Koblenz','1984-01-01'); +call add_person('Ellen Louise','Ripley','1979-01-01'); + +update account set balance = 2000 where id = 4; +update account set balance = 2100 where id = 6; +update account set balance = 1200 where id = 9; + +update account set balance = 3400 where id = 13; +update account set balance = 200 where id = 15; +update account set balance = 3000 where id = 16; +update account set balance = 3000 where id = 19; + +update account set balance = 3420 where id = 20; +update account set balance = 2000 where id = 21; +update account set balance = 2500 where id = 22; +update account set balance = 2300 where id = 23; +update account set balance = 2000 where id = 28; +update account set balance = 3500 where id = 29; + +update account set balance = 1600 where id = 31; +update account set balance = 1500 where id = 33; +update account set balance = 500 where id = 34; +update account set balance = 9140 where id = 35; +update account set balance = 1600 where id = 36; +update account set balance = 500 where id = 37; +update account set balance = 2400 where id = 38; + +update account set balance = 2200 where id = 41; +update account set balance = 2500 where id = 44; +update account set balance = 3500 where id = 46; +update account set balance = 990 where id = 47; + +update account set balance = 800 where id = 50; +update account set balance = 5200 where id = 51; +update account set balance = 3500 where id = 53; +update account set balance = 1000 where id = 54; +update account set balance = 1600 where id = 55; +update account set balance = 4000 where id = 57; + +update account set balance = 500 where id = 63; +update account set balance = 3500 where id = 65; +update account set balance = 1600 where id = 66; +update account set balance = 2900 where id = 67; +update account set balance = 2000 where id = 68; +update account set balance = 500 where id = 69; + +update account set balance = 1500 where id = 71; +update account set balance = 1800 where id = 77; +update account set balance = 1600 where id = 78; + +update account set balance = 1500 where id = 62; +update account set balance = 1500 where id = 26; + +with addholder as ( +insert into holder (type) values ('COMPANY') returning id ) +insert into company (id, name, registration_number, created_at) +select + addholder.id, + 'Boulangerie de Valorgue', 'FR19803269968', '2014-08-19' + from addholder; + call transfer(45,66,239,'2025-01-05'); call transfer(50,43,128,'2025-03-02'); @@ -289,4 +354,4 @@ call transfer(51,24,1010,'2025-05-26'); call transfer(24,23,952,'2025-05-10'); call transfer(73,71,552,'2025-05-27'); call transfer(71,4,773,'2025-03-17'); -call transfer(4,73,634,'2025-04-30 +call transfer(4,73,634,'2025-04-30');