Bonjour à tous, je suis en train de développer un projet en php html et javascript, et une fois de plus je fais face à un problème de SQL qui me pose un gros souci.
En fait, j'ai une table facture, eleve, paiement, annee_scolaire, type_ecole et une table site.
Ci-dessous la structure de toutes les tables

tbl_eleve_el           = el_id, el_nom
tbl_facture_fac        = fac_code, fac_montant, fac_motif, el_id,typ_id, sit_id, ann_id
tbl_paiement_pai       = pai_id, pai_mont_cash, pai_mont_rest, fac_code
tbl_typeecole_typ      = typ_id, typ_libelle
tbl_site_sit           = sit_id, sit_libelle
tbl_annee_scolaire_ann = ann_id, ann_libelle

L'idée est d'obtenir une liste des élèves qui ont déjà payés ou qui n'ont pas encore payés le frais scolaire.
Une fois, la liste affichée, qu'on ait la possibilité de filtrer la liste par montant. Un montant estimé minimum payé par chaque élevé, histoire de connaître les élèves qui doivent encore bcp d'argent et de leur rappeler de s'acquitter avant une date d'échéance qui leur sera donnée.
Voici la requête que je lançais

  SELECT 
        E.el_nom AS Nom,
        COALESCE(SUM(P.pai_mont_cash_usd), 0) AS montant_cash,
        (F.fac_mont - COALESCE(SUM(P.pai_mont_cash_usd), 0)) AS solde
  FROM 
         tbl_facture_fac AS F 
         JOIN tbl_etudiant_etu AS E ON F.el_id = E.el_id
         JOIN tbl_typeecole_typ AS T ON F.typ_id = T.typ_id
         JOIN tbl_site_sit AS S ON F.sit_id = S.sit_id
         JOIN tbl_annee_scolaire_ann AS A ON F.ann_id = A.ann_id
         LEFT JOIN tbl_paiement_pai AS P ON F.fac_code = P.fac_code
 WHERE
        T.typ_id = 1 AND
        S.sit_id = 1 AND
        A.ann_id = 1

Le problème se pose au niveau de l'affichage:

  1. Au lieu d'obtenir plusieurs lignes, la requette me renvoie une seule ligne soit la situation d'un élève pendant qu'il y a plusieurs élèves qui sont dans la même situation.
  2. Pour filtrer le résultat à partir d'un champ, pose aussi un autre souci car le champ solde nous affiche la dette qui reste à payer, je ne sais pas à quel niveau je dois passer la condition du montant qui sera entrer dans le formulaire pour pouvoir filtrer la colonne des sommes obtenues par cette syntaxe ci- dessous et qui se trouve dans la partie SELECT de la requête sql:
(F.fac_mont - COALESCE(SUM(P.pai_mont_cash_usd), 0)) AS solde

Je vous prie de m'eclaircir là dessus car je suis vraiment perdu

1 réponse


Je viens de reflechir autrement, en faisant une requête pour obtenir la liste des élèves ayant payé un frais.
Là j'ai obtenu la liste de tous les élèves, mais le souci reste au niveau de vouloir trier ou filtrer uniquement les
élèves un certains montant du frais en question (par exemple: si le frais de paiement est de 50 usd, on aimerait avoir la liste des élèves qui la moitié du montant de frais), mais avec cette requête, le résultat ne correspond pas à mon attente, car elle me renvoit la liste même des élèves qui ont un solde 0.
Je vous prie de me sortir de l'ignorance, apparemment j'ai loupé quelque chose

                SELECT
                         E.etu_nom_complet AS Nom_Complet,
                         SUM(P.pai_mont_cash_usd) AS montant_cash,
                         F.fac_mont - SUM(P.pai_mont_cash_usd) AS Dettes,
                         T.typ_libelle AS Nom_Ecole,
                         S.sit_libelle AS Nom_Site,
                         A.ann_libelle AS Annee_scolaire
                     FROM
                         tbl_facture_fac AS F
                         JOIN tbl_paiement_pai AS P ON F.fac_code = P.fac_code
                         JOIN tbl_eleve_el AS E ON F.el_id = E.el_id
                         JOIN tbl_typeecole_typ AS T ON F.typ_id = T.typ_id
                         JOIN tbl_site_sit AS S ON F.sit_id = S.sit_id
                         JOIN tbl_annee_scolaire_ann AS A ON F.ann_id = F.ann_id
                         JOIN tbl_frais_fra AS Fr ON F.fra_id = F.fra_id 
                     WHERE
                         T.typ_id = 1 AND
                         S.sit_id = 1 AND
                         A.ann_id = 1 AND
                         Fr.fra_id = 1 AND
                         P.pai_mont_cash_usd = 50
                     GROUP BY F.fac_code