Skip to main content
Announcements
Join us on Feb.12 to Discover what’s possible with embedded analytics: REGISTER TODAY
cancel
Showing results for 
Search instead for 
Did you mean: 
jduluc12
Creator
Creator

Script question

Hi,

My data looks like this.

F1 F2 F3 F4
A B 2 80
A C 2 80
A E-1 4 80
B D 4 25
B C 2 25
B E-2 3 25
C E-1 2 20
C E-2 3 20
C E-3 4 20
D E-3 5  

 

The desired output is something like this.

E-1 1420
E-2 2205
E-3 5900

 

The calculation happens something like this.

    Hint Total
A   F4 80
  B F4 *F3 (80 *2) 160
  C F4*F3 ( 80 *2) 160
  E-1 F4*F3 ( 80 *4) 320
B   160 + 25 (F4) 185
  D 185 * 4 (F3) 740
  C 185 * 2 (F3) 370
  E-2 185 * 3 (F3) 555
C   160 + 20 (F4) + 370 550
  E-1 550 * 2 (F3) 1100
  E-2 550 * 3 (F3) 1650
  E-3 550 * 4 (F3) 2200
D      740
  E-3 740 * 5 (F4) 3700

 

So we achieve this.

E-1 1420
E-2 2205
E-3 5900

 

I want to write a script to achieve this. 

Is it possible?

Thanks,

Labels (1)
1 Solution

Accepted Solutions
Kushal_Chawda

@jduluc12  one solution could be

Data:
Load * Inline [
F1	F2	F3	F4
A	B	2	80
A	C	2	80
A	E-1	4	80
B	D	4	25
B	C	2	25
B	E-2	3	25
C	E-1	2	20
C	E-2	3	20
C	E-3	4	20
D	E-3	5	 ](delimiter is '\t');

New:
Load *,     if(F1<>Previous(F1),F1&'_'&rangesum(keepchar(Peek('Group'),'0123456789'),1),Peek('Group')) as Group
Resident Data
Order by F1,F2;

Drop Table Data;

Final:
Load 0 as Temp
AutoGenerate 0;

for Each vGroup in FieldValueList('Group')

let vF1 = SubField('$(vGroup)','_',1);

let vF1_Number = SubField('$(vGroup)','_',2);

if '$(vF1_Number)' =1 then

Concatenate(Final)
Load *,
     F3*F4 as Required_Value
Resident New
Where F1 = '$(vF1)';

Else

Temp:
Load sum(Required_Value) as F4a
Resident Final
where F2 ='$(vF1)';

let vF4a = Peek('F4a',0,'Temp');

Drop Table Temp;

Concatenate(Final)
Load *,
     F3*rangesum('$(vF4a)',F4)  as Required_Value
Resident New
Where F1 = '$(vF1)';     

EndIf

Next

Drop Fields Temp,Group;

Drop Table New;

 

Screenshot 2023-06-14 at 11.43.13.png

View solution in original post

1 Reply
Kushal_Chawda

@jduluc12  one solution could be

Data:
Load * Inline [
F1	F2	F3	F4
A	B	2	80
A	C	2	80
A	E-1	4	80
B	D	4	25
B	C	2	25
B	E-2	3	25
C	E-1	2	20
C	E-2	3	20
C	E-3	4	20
D	E-3	5	 ](delimiter is '\t');

New:
Load *,     if(F1<>Previous(F1),F1&'_'&rangesum(keepchar(Peek('Group'),'0123456789'),1),Peek('Group')) as Group
Resident Data
Order by F1,F2;

Drop Table Data;

Final:
Load 0 as Temp
AutoGenerate 0;

for Each vGroup in FieldValueList('Group')

let vF1 = SubField('$(vGroup)','_',1);

let vF1_Number = SubField('$(vGroup)','_',2);

if '$(vF1_Number)' =1 then

Concatenate(Final)
Load *,
     F3*F4 as Required_Value
Resident New
Where F1 = '$(vF1)';

Else

Temp:
Load sum(Required_Value) as F4a
Resident Final
where F2 ='$(vF1)';

let vF4a = Peek('F4a',0,'Temp');

Drop Table Temp;

Concatenate(Final)
Load *,
     F3*rangesum('$(vF4a)',F4)  as Required_Value
Resident New
Where F1 = '$(vF1)';     

EndIf

Next

Drop Fields Temp,Group;

Drop Table New;

 

Screenshot 2023-06-14 at 11.43.13.png