vues
This commit is contained in:
152
banque.md
152
banque.md
@@ -664,3 +664,155 @@ create table operation (
|
|||||||
"direction" text check (direction in ('DEBIT', 'CREDIT'))
|
"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.
|
||||||
|
|||||||
9
banque/banque.4.sql
Normal file
9
banque/banque.4.sql
Normal file
@@ -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
|
||||||
@@ -11,49 +11,114 @@ update account set balance = 100000 where id = 1;
|
|||||||
update account set balance = 50000 where id = 2;
|
update account set balance = 50000 where id = 2;
|
||||||
update account set balance = 200000 where id = 3;
|
update account set balance = 200000 where id = 3;
|
||||||
|
|
||||||
call add_person('Albane','Trottier', '1990-01-01', array['USD']);
|
insert into exchange_rate values
|
||||||
call add_person('Josef','Jakubowski', '1990-01-01',array['EUR', 'EUR']);
|
('EUR', '1999-01-01', 1),
|
||||||
call add_person('Ali','Sahim', '1990-01-01', array['EUR']);
|
('USD', '2025-01-02', 1.0321),
|
||||||
call add_person('Émilie','Jolie', '1990-01-01', array['EUR']);
|
('USD', '2025-02-03', 1.0274),
|
||||||
call add_person('Soufiane','Mamoun', '1990-01-01',array['EUR', 'EUR']);
|
('USD', '2025-03-03', 1.0465);
|
||||||
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('Albane','Trottier', '1987-01-01', array['USD']);
|
||||||
call add_person('Julie','Thomis', '1990-01-01',array['EUR', 'EUR', 'EUR']);
|
call add_person('Josef','Jakubowski', '1988-01-01',array['EUR', 'EUR']);
|
||||||
call add_person('Marc','Aurèle', '1990-01-01',array['USD', 'EUR', 'EUR']);
|
call add_person('Ali','Sahim', '1989-01-01', array['EUR']);
|
||||||
call add_person('Albert','Unepierre', '1990-01-01', array['EUR']);
|
call add_person('Émilie','Jolie', '1992-01-01', array['EUR']);
|
||||||
call add_person('Lucas','George', '1990-01-01', array['EUR']);
|
call add_person('Soufiane','Mamoun', '1993-01-01',array['EUR', 'EUR']);
|
||||||
call add_person('Lyna','Khoudri', '1990-01-01',array['EUR', 'USD']);
|
call add_person('Élodie','Bérengier', '1991-01-01',array['EUR', 'EUR']);
|
||||||
call add_person('Nour','Zermani', '1990-01-01', array['USD']);
|
call add_person('Eugène','Makiadi', '1994-01-01', array['EUR']);
|
||||||
call add_person('Théophile','M''Beko', '1990-01-01',array['EUR', 'USD']);
|
call add_person('Julie','Thomis', '1980-01-01',array['EUR', 'EUR', 'EUR']);
|
||||||
call add_person('Sébastien','Voltier', '1990-01-01', array['EUR']);
|
call add_person('Marc','Aurèle', '1981-01-01',array['USD', 'EUR', 'EUR']);
|
||||||
call add_person('Matteo','Giordano', '1990-01-01',array['EUR', 'USD']);
|
call add_person('Albert','Unepierre', '1982-01-01', array['EUR']);
|
||||||
call add_person('Diego','Delavega', '1990-01-01',array['EUR', 'EUR', '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('Geoffrey','Lebowski', '1990-01-01',array['EUR', 'EUR', 'EUR']);
|
||||||
call add_person('Ælita','Dornburg', '1990-01-01',array['EUR', 'USD']);
|
call add_person('Ælita','Dornburg', '1991-01-01',array['EUR', 'USD']);
|
||||||
call add_person('João','Costa', '1990-01-01',array['EUR']);
|
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('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('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('Apolline','de Bazelaire de Lesseux', '1984-01-01',array['EUR']);
|
||||||
call add_person('Aylin','Özkan', '1990-01-01',array['EUR', 'EUR', 'EUR']);
|
call add_person('Aylin','Özkan', '1985-01-01',array['EUR', 'EUR', 'EUR']);
|
||||||
call add_person('Yana','Zhdanova', '1988-02-28',array['EUR', 'EUR']);
|
call add_person('Yana','Zhdanova', '1993-02-28',array['EUR', 'EUR']);
|
||||||
call add_person('Nayiri','Zakarian', '1990-01-01',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('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('Martial','Mondésir', '1990-01-01', array['EUR', 'EUR', 'EUR']);
|
||||||
call add_person('Tom','Kishida', '1990-01-01',array['EUR', 'EUR']);
|
call add_person('Tom','Kishida', '1995-01-01',array['EUR', 'EUR']);
|
||||||
call add_person('Zainap','Bisliev', '1990-01-01',array['EUR']);
|
call add_person('Zainap','Bisliev', '1997-01-01',array['EUR']);
|
||||||
call add_person('Maï Ly','Pham Le', '1990-01-01',array['EUR', 'EUR']);
|
call add_person('Maï Ly','Pham Le', '1999-01-01',array['EUR', 'EUR']);
|
||||||
call add_person('Laurent','Ramasawmy', '1990-01-01',array['EUR']);
|
call add_person('Laurent','Ramasawmy', '1993-01-01',array['EUR']);
|
||||||
call add_person('Atika','Mroudjaé', '1990-01-01',array['EUR', 'EUR', '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('Alice','Inechains', '1987-07-07',array['EUR']);
|
||||||
call add_person('Laureline','Mézières', '1990-01-01',array['EUR', 'USD']);
|
call add_person('Laureline','Mézières', '1986-01-01',array['EUR', 'USD']);
|
||||||
call add_person('Valerian','Christin', '1990-01-01',array['EUR', 'EUR', 'USD']);
|
call add_person('Valerian','Christin', '1987-01-01',array['EUR', 'EUR', 'USD']);
|
||||||
call add_person('Alice','Kingsleigh', '1990-01-01',array['EUR', 'USD', 'EUR']);
|
call add_person('Alice','Kingsleigh', '1981-01-01',array['EUR', 'USD', 'EUR']);
|
||||||
call add_person('Amélie','Pond', '1990-01-01',array['EUR', 'EUR', 'EUR']);
|
call add_person('Amélie','Pond', '1998-01-01',array['EUR', 'EUR', 'EUR']);
|
||||||
call add_person('Eyota','Olmsted', '1990-01-01',array['EUR', 'EUR']);
|
call add_person('Eyota','Olmsted', '1992-01-01',array['EUR', 'EUR']);
|
||||||
call add_person('Hapsatou','Sall','1990-01-01');
|
call add_person('Hapsatou','Sall','1982-01-01');
|
||||||
call add_person('Arthur','Koblenz','1990-01-01');
|
call add_person('Arthur','Koblenz','1984-01-01');
|
||||||
call add_person('Ellen Louise','Ripley','1990-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(45,66,239,'2025-01-05');
|
||||||
call transfer(50,43,128,'2025-03-02');
|
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(24,23,952,'2025-05-10');
|
||||||
call transfer(73,71,552,'2025-05-27');
|
call transfer(73,71,552,'2025-05-27');
|
||||||
call transfer(71,4,773,'2025-03-17');
|
call transfer(71,4,773,'2025-03-17');
|
||||||
call transfer(4,73,634,'2025-04-30
|
call transfer(4,73,634,'2025-04-30');
|
||||||
|
|||||||
Reference in New Issue
Block a user