l'idée est là mais il faut passer par une table intermédiaire table_tmp qui contient les valeurs nb pour les croisements existants et les autres croisements qui n'ont pas de valeur. il faut ensuite écrire différemment la fonction de cumul.
L'ordre de tri compte également, il faut d'abord trier par type puis par mois, puisque l'objectif est de cumuler les nb au sein d'un même type.
Ne pouvant trier les mois Jan, Fev, Mars car le tri alphabétique les met dans le mauvais ordre, je suis passé par une petite table de correspondance (table_mois) faisant le lien libellé du mois <-> n° du mois
Pour le calcul du cumul : Il faut gérer les ruptures sur le type via la fonction previous() qui renvoie la valeur de l'enregistrement précédent
Attention, le null est absorbant donc null+1=null et non pas 1. D'où if(isnull(Nb) plutôt que sur le cumul
voilà une solution :
table_données:
LOAD * INLINE [
Mois, Type, Nb
Jan, A, 1
Jan, B, 2
Fev, A, 3
Mars, B, 1
];
table_mois:
mapping LOAD * INLINE [
Mois, NumMois
Jan, 1
Fev, 2
Mars, 3
];
table_type:
LOAD * INLINE [
Type,
A,
B
];
//map Mois using table_mois;
table_tmp: // genere un produit cartésien type/mois
load distinct applymap('table_mois', Mois) as NumMois, Mois resident table_données;
join load Type resident table_type;
// récupère pour les croisements existants la valeur de Nb
left join load
Mois, Type, Nb
resident table_données;
// Calcule le cumul sur le champ nb
table:
load
Mois,
Type,
Nb,
If(Type=Previous(Type), if(isnull(Nb),0,Nb)+Peek( 'Cumul' ),if(isnull(Nb),0,Nb)) as Cumul
resident table_tmp
order by Type, NumMois;
drop table table_tmp;
drop table table_données;
La preuve par l'image dans le fichier joint, promis sans tricher

...
Dites mois si ça fonctionne bien chez vous
Fichier attaché : Nom de fichier :
cumul.jpgTaille de fichier : 9633