Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Take a value from one row and put into another

Hi guys!

Very interesting question, I couldn't find the answer in google yet. Please help or give an advice.

The situation:

I have table 1

StoreItemAvailableChecked

S1

I10*
S2I10*
S3I12
S4I10*
S5I10
TI12

The task is to take Available values from store T and spread it into other Checked stores. It should spread only 1 item for each necessary store.

Finally table would look like:

StoreItemAvailableCheckedFinally

S1

I10*1
S2I10*1
S3I122
S4I10*0
S5I100
TI120

Also please help to make new row where I could write from which store I took item and where I put this item.

1 Solution

Accepted Solutions
Not applicable
Author

Hi, then can modify in this way.

Previous:

if(Store='T',$(StockLeft),

  if(Available = 0 and numsum(Checked,peek(Accu_Check,-1))<=$(Stock),1,0)

) as Final

Now:

if(Store='T',$(StockLeft),

  if(Available = 0,

               if(numsum(Checked,peek(Accu_Check,-1))<=$(Stock),1,0),

     Available)

) as Final

View solution in original post

14 Replies
vishsaggi
Champion III
Champion III

Need more information, based on what conditions your final column [Finally] is populated ?

Not applicable
Author

The final column calculated in such way:

1) It finds 0 values in column Available and sign '*' in column Checked. Let's call them 'Wanted'

2) Looks for values in store T to put them into 'Wanted' stores

3) We can put maximum 1 item into each store.

So, we have 'Wanted' stores - S1,S2,S4

We have available items in store T equal to 2.

We need to spread  the values from T to S1,S2,S4.

So we take 1 from T to S1, we take 1 from T to S2. Then we see that T is empty. We finish spreading process.

Finally, we have:

S1-1

S2-1

S3-2

S4-0

S5-0

T-0

Anonymous
Not applicable
Author

Hi Iskander,

You can do this :

Let t_Count = Load Available resident Table1 where Store = 'T';

Let vIter = Load count(Checked) resident Table1 where Checked = 1;

A:

for i = 1 to vIter

Load *, 1 as Finally resident Table1 where Checked =1 and $(t_Count) >0;

Let t_Count = t_Count-1;

Next i

Concatenate

Load *, 0 as Finally resident Table1 where Checked =1 and Finally <>1;

Hope this works.

Thanks,

Stabdha

Not applicable
Author

Hi Stabdha!

Thank you for your reply. I understood the logic.

The only thing is that qlikview drops the syntax error in the row -

Let t_Count = Load Available resident Table1 where Store = 'T';



Not applicable
Author

Hi Islander,

First peek the value from T keep this in a variable var1.

Next resident load the table with an if saying

If(condition=* and available =0), var2 =var2 +1,

0 as flag.

This will give you a variable var2 with no of stores you want to divide the value of T.

Next resident load again

This time

For I = 0 to var1

peek (third table, rowno() = i

If(condition=* and available =0) and flag <var1

then finally = flag+1 and flag=flag+1;

Var1 =var1- 1;



You have to repeat the for loop if var1 > count(*) in the table.

Sorry I cannot give you the exact code, but this will give you some idea, if you can share a qvw, I may check the feasibility of my pseudo code too.

Regards

Not applicable
Author

You may want to try this. Final is the result table.

Raw:

LOAD * INLINE [

    Store, Item, Available

    S1, I1, 0

    S2, I1, 0

    S3, I1, 2

    S4, I1, 0

    S5, I1, 0

    T, I1, 2

];

RawTemp0:

load *,

If(Available = 0,1,0) as Checked

Resident Raw;

RawTemp1:

load

Count(Store) as EmptyStores

Resident Raw

where Available = 0;

Let EmptyStores = peek('EmptyStores');

RawTemp2:

load

Available as Stock

Resident Raw

where Store = 'T';

Let Stock = peek('Stock');

let StockLeft = if($(Stock) - $(EmptyStores)<0,0,$(Stock) - $(EmptyStores));

Final:

load

*,

numsum(Checked,peek(Accu_Check,-1)) as Accu_Check,

if(Store='T',$(StockLeft),

  if(Available = 0 and numsum(Checked,peek(Accu_Check,-1))<=$(Stock),1,0)

) as Final

resident RawTemp0;

drop table Raw, RawTemp0, RawTemp1, RawTemp2;

Anonymous
Not applicable
Author

Iskander, what you can do is

Temp :

Load Available resident Table1 where Store = 'T';

Let t_Count = Peek('Available' , -1, 'Temp');

and then

Drop table Temp;

Hope this might help you .

Thanks,

Stabdha

Not applicable
Author

Thank you!

The only thing, we have to keep the available 2 items for store S3. But in Final column it changed to 0

Not applicable
Author

Thank you! Great explanation. But hard to make it.. I have a lot of syntax errors unfortunately.

I attached the qvw, so you can try to make it.

Thank you again for help!