Skip to main content
Announcements
Live today at 11 AM ET. Get your questions about Qlik Connect answered, or just listen in. SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

sum(if(sum(amount)<200,amount/10,amount/100) as newPrice

Hi community!

I need a kind of a stack in qlikview,...

I have a table with amount + date, which is chronologically.


I want a new field, where all items  within the 200 bucks limit(chronologically) have an discount of %10, otherwise 1% discount)

This doesn't work: sum(if(sum(amount)<200,amount/10,amount/100) as newPrice

in Qlikview I can not use sum() within an if statement

1 Solution

Accepted Solutions
jykang0638
Partner - Contributor III
Partner - Contributor III

Hi, try the below.

LOAD Product, Amount, Price, Date
, NumSum(Amount, Peek('Sum_Amount')) as Sum_Amount
, If(NumSum(Amount, Peek('Sum_Amount')) < 200, Price * 0.9, Price * 0.99) as New_Price
Resident Products
Order By Date asc;

It's just example code, so adjust to your env.
I hope it will help you.

View solution in original post

19 Replies
jvitantonio
Luminary Alumni
Luminary Alumni

Do you want this in the  script? This is, add a new fild on your table with the new price?

If(amount<200, amount*0.1, amount*0.01) as NewPrice

Not applicable
Author

If this is in the script you can only do sums if it has a group by clause.

If it isn't in the script you might be looking for aggr,

sum(aggr(if(sum(amount)<200,sum(amount/10),sum(amount/100)),item))

Not applicable
Author

No, it's hard to explain

The first products ( Date - chronologically )  which are in summary under 200 should get an discount of 10%, the rest should get only 1%.
Yes it's in the script

Hopefully you unterstood me
Thanks and regards

Not applicable
Author

Do you have a group by clause? You will need to do a resident load Group by section to be able to use sum in the script.

I do not really understand the

The first products ( Date - chronologically )

part. Is it only a certian amount of products that you want this applied to, or all products where the total sum is under 200?

Not applicable
Author

ok for example:

Limit: 200

Table:  Amount    -  Date

product1: 50   -  1.2.2012

product2: 60   -  3.2.2012

product3: 80   -  4.2.2012

product4: 40   -  5.2.2012

product5: 10   -  6.2.2012
====================

               240

so products 1,2,3 should get 10% discount ( first products wich are under the limit = 200 )

product 4 +5 should  get 1% discount.


How do I realize it?


This way is much better for me:

The summary of the value which is under 200 should get 10%  and the rest value (40 ) should get 1%

So  the first product ( 1,2,3,  1/4 of 4 ) should get 10%

the rest ( 3/4 of product 4, product 5 ) should get 1%.

That means:  total value of 200 gets 10%

                      the rest value ( 40) gets 1%

I know that I have to use group by,  but if i combine Sum()  and an if statement  it gives me an error...

Not applicable
Author

I am not sure if this is possible in the script, if it is then it is beyond my skill level.

Not applicable
Author

yes that's right, normaly I would need somethink like a stack and put one by one out, to fill the limit of 200,  but in qlikview it's totally difficult to realize that.

Not applicable
Author

Do you have a set number of products you are working with, and will it always be product 1 on day 1 product 2 day 2 ect.?

sebastiandperei
Specialist
Specialist

Hi, try:

Products:

Load

     Product,

     Amount,

     Price,

     Date,

     RowNo() as Ord

Resident ProductsTemp

Order By Date Asc;

Let Acc = 0;

For A = 1 to NoOfRows('Products')

     Let PrAmount = Peek('Amount',$(A),'Products');

     Let Acc = $(Acc) + $(PrAmount);

     If $(Acc)>200 then

          Let OrdLim = Peek('Ord',$(A),'Products');

          Exit For;

     End If;

Next;

Left Join (Products)

Load

     *,

     If (Ord>=$(OrdLim), 0.09, 0.9)*Price as NewPrice;

Resident Products;

Please, correct sintaxys if im wrong, because im writing directly here.

Tell me if it works.