|
| 1 | +use bankapp; |
| 2 | + |
| 3 | +/* Identifier les clients avec un |
| 4 | + total d'investissements supérieur à leur solde total. |
| 5 | + */ |
| 6 | +SELECT clients.id_client, comptes.solde, SUM(transactions.montant) as total_transactions |
| 7 | +FROM clients |
| 8 | + JOIN comptes ON clients.id_client = comptes.id_client |
| 9 | + JOIN transactions ON transactions.id_compte = comptes.id_compte |
| 10 | +WHERE transactions.statut = 'validé' |
| 11 | +GROUP BY clients.id_client, comptes.solde |
| 12 | +HAVING SUM(transactions.montant) > comptes.solde |
| 13 | + |
| 14 | +/* |
| 15 | + Trouver les comptes ayant le plus haut taux de transactions réussies |
| 16 | + */ |
| 17 | +SELECT DISTINCT comptes.id_compte, comptes.id_client, c.prenom, c.nom, /* Récupérer les infos à afficher */ |
| 18 | + COUNT(transactions.id_transaction) as transactions_reussies, /* récupération des transactions */ |
| 19 | + COUNT(transactions.id_transaction) * 100.0 / |
| 20 | + (SELECT COUNT(*) FROM transactions WHERE transactions.id_compte = comptes.id_compte) as taux_reussite /* Calcul du % de réussite des transactions */ |
| 21 | +FROM comptes /* Les infos sont à récupérer depuis la table "comptes". */ |
| 22 | + JOIN transactions ON comptes.id_compte = transactions.id_compte /* On a besoin également des infos de la table "transactions". */ |
| 23 | + JOIN clients c ON c.id_client = comptes.id_client /* Également besoin des infos de la table "clients". */ |
| 24 | +WHERE transactions.statut = 'validé' /* Pour le calcul du % de transactions réussies, on veut uniquement les transactions avec le status "validé". */ |
| 25 | +GROUP BY comptes.id_compte, comptes.id_client, c.prenom /* Regrouper les résultats par client via son compte */ |
| 26 | +ORDER BY taux_reussite DESC, transactions_reussies DESC /* On applique un tri pour que les % de réussites plus élevées soient en tête de liste */; |
| 27 | + |
| 28 | +/* |
| 29 | + Lister les clients qui n'ont pas utilisé de services de prêt ou d'investissement |
| 30 | + */ |
| 31 | +SELECT DISTINCT c.id_client, c.nom, c.prenom /* On récupère l'ID, le nom et prénom du client, en indiquant qu'on veut un résultat unique par client */ |
| 32 | +FROM clients c /* Sélection de la table "clients" */ |
| 33 | + LEFT JOIN comptes co ON c.id_client = co.id_client /* Récupération des infos dans la table des comptes */ |
| 34 | + LEFT JOIN prets p ON c.id_client = p.id_client /* Récupération des infos dans la table des prêts */ |
| 35 | + LEFT JOIN transactions t ON co.id_compte = t.id_compte AND t.type = 'investissement' /* Récupération des infos dans la table des transactions */ |
| 36 | +WHERE p.id_pret IS NULL /* On veut que les prêts soient nuls (vides) */ |
| 37 | + AND t.id_transaction IS NULL /* et aussi qu'aucune transaction ne soit enregistrée */; |
| 38 | + |
| 39 | +/* |
| 40 | + Déterminer le montant total des intérêts générés par les prêts - VERSION ANNUELLE |
| 41 | + */ |
| 42 | +SELECT SUM(montant * taux_interet) AS total_interets_annuels /* Addition de la multiplication du montant de chaque prêt avec le taux d'intérêt */ |
| 43 | +FROM prets; /* À partir de la table "prets". Permet de calculer sur l'année */ |
| 44 | + |
| 45 | +/* |
| 46 | + Déterminer le montant total des intérêts générés par les prêts - SUR LA TOTALITÉ DU PRÊT |
| 47 | + */ |
| 48 | +SELECT SUM(montant * taux_interet * (duree / 12)) AS total_interets |
| 49 | +FROM prets; |
| 50 | + |
| 51 | +/* |
| 52 | + Déterminer le montant total des intérêts générés par les prêts - MENSUEL |
| 53 | + */ |
| 54 | +SELECT |
| 55 | + id_pret, /* Sélectionne l'identifiant du prêt */ |
| 56 | + montant, /* Avec le montant */ |
| 57 | + taux_interet, /* Et le taux d'intérêt */ |
| 58 | + montant * (taux_interet / 12) AS interets_mensuels /* Calcul des intérêts pour un mois */ |
| 59 | +FROM prets; /* À partir de la table des prêts */ |
| 60 | + |
| 61 | +/* Calculer la variation mensuelle du nombre de transactions */ |
| 62 | + |
| 63 | +WITH transactions_mensuelles AS ( |
| 64 | + /* Définition d'une Common Table Expression : "transactions_mensuelles" */ |
| 65 | + SELECT |
| 66 | + DATE_FORMAT(date_transaction, '%Y-%m-01') AS mois, |
| 67 | + /* Convertit la date de transaction en format 'YYYY-MM-01', pour regrouper toutes les transactions du même mois */ |
| 68 | + COUNT(*) AS nombre_transactions |
| 69 | + /* On compte le nombre de transactions pour chaque mois */ |
| 70 | + FROM transactions |
| 71 | + /* À partir de la table "transactions" */ |
| 72 | + GROUP BY DATE_FORMAT(date_transaction, '%Y-%m-01') |
| 73 | + /* On regroupe les résultats par mois */ |
| 74 | +), |
| 75 | + transactions_avec_mois_precedent AS ( |
| 76 | + /* Définition d'une deuxième Common Table Expression */ |
| 77 | + SELECT |
| 78 | + mois, |
| 79 | + nombre_transactions, |
| 80 | + LAG(nombre_transactions) OVER (ORDER BY mois) AS nombre_transactions_mois_precedent |
| 81 | + /* Utilise la fonction LAG pour obtenir le nombre de transactions du mois précédent */ |
| 82 | + FROM transactions_mensuelles |
| 83 | + /* Utilise les résultats de la première Common Table Expression */ |
| 84 | + ) |
| 85 | +SELECT |
| 86 | + mois, |
| 87 | + nombre_transactions, |
| 88 | + nombre_transactions_mois_precedent, |
| 89 | + nombre_transactions - nombre_transactions_mois_precedent AS variation_absolue, |
| 90 | + /* Calcule la variation du nombre de transactions */ |
| 91 | + IF(nombre_transactions_mois_precedent = 0, NULL, |
| 92 | + (nombre_transactions - nombre_transactions_mois_precedent) * 100.0 / nombre_transactions_mois_precedent) AS variation_pourcentage |
| 93 | +/* Calcule la variation en %, en gérant le cas où le mois précédent aurait 0 transaction pour éviter les erreurs de calcul */ |
| 94 | +FROM transactions_avec_mois_precedent |
| 95 | +ORDER BY mois; |
| 96 | +/* Trie les résultats par ordre chronologique */ |
0 commit comments