Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour,
Voici un exemple de ma table de paiement T_PAIEMENT extraite directement de plusieurs fichiers Excel mensuels concaténés :
CodeClient | DateFichier | DatePaiement | MontantPaiement |
---|---|---|---|
BDI | 201504 | 2015 | 5000 |
BDI | 201505 | 2015 | 6000 |
BDI | 201506 | 2015 | 8000 |
Ici le champ MontantPaiement contient les montants cumulés des paiements pour l'année 2015.
A partir de cette table je voudrais calculer les mensualités pour chaque client à une date donnée, c'est à dire que pour ce client je voudrais avoir la table suivante :
CodeClient | DateFichier | DatePaiement | MontantPaiement | Mensualité |
---|---|---|---|---|
BDI | 201504 | 2015 | 5000 | 5000 (=montant du premier paiement) |
BDI | 201505 | 2015 | 6000 | 1000(=6000-5000 : montant de la mensualité de Mai 2015) |
BDI | 201506 | 2015 | 8000 | 2000(=8000-6000 : montant de la mensualité de juin 2015) |
Pour faire ce calcul la seule idée qui me vient c'est de faire un auto-jointure dans le script en faisant un test sur la DateFichier mais au niveau performance ce n'est vraiment pas le top....
Est-ce que quelqu'un aurait une autre idée svp ou au moins de quoi optimiser mon code?
Voici mon bout de code :
I_PAIEMENT:
LOAD
CodeClient
DateFichier as DateFichierM1
MontantPaiement as MontantPaiementM1
Resident T_PAIEMENT;
left join LOAD *
Resident T_PAIEMENT;
Drop Table T_PAIEMENT;
J_PAIEMENT:
LOAD
CodeClient
DateFichier
DatePaiement
MontantPaiement
if(not isnull(MontantPaiementM1),MontantPaiement - MontantPaiementM1,MontantPaiement) as Mensualite
Resident I_PAIEMENT
Where DateFichier = addMonth(DatFichierM1,1);
Merci beaucoup
Bonjour,
Pour réaliser ceci, tu peux utiliser la fonction peek()
et donc quelque chose comme :
LOAD
CodeClient,
DateFichier as DateFichierM1,
If(peek(CodeClient)=CodeClient, // test si le client est le même que la ligne précédente
MontantPaiement-peek(MontantPaiement),// si oui, fais la différence
MontantPaiement) as MontantPaiementM1 // si non, garde le montant du premier paiement
Resident T_PAIEMENT
order by CodeClient,DateFichier; // la table est triée pour que les clients soient les uns après les autres