Don't miss your chance to take the Fabric Data Engineer (DP-600) exam for FREE! Find out how by attending the DP-600 session on April 23rd (pacific time), live or on-demand.
Learn moreJoin the FabCon + SQLCon recap series. Up next: Power BI, Real-Time Intelligence, IQ and AI, and Data Factory take center stage. All sessions are available on-demand after the live show. Register now
Hi Community!
Is there a quick way in Power BI / DAX to calculate remaining quantity?
I have following sample table where i need to calculate balance quantity (REMAIN_QTY). In my table i have Order Quantity as 100 and each time the quantity is issued to the Sales Order, I want to record it as balance (REMAIN_QTY) to fulfill the sales order requirement.
| ORDER-LINE | ORDER QTY | Demand_Order | ALLOTTED_QTY | REMAIN_QTY |
| SO-AB1234/1 | 100 | SO-AB1234/1 | 20 | 80 |
| SO-AB1234/1 | SO-AB1234/1 | 30 | 50 | |
| SO-AB1234/1 | SO-AB1234/1 | 40 | 10 | |
| SO-AB1234/1 | SO-AB1234/1 | 10 | 0 |
It is so very easy in Excel, any quick way to do the same here in Power BI?
Will really appreciate a quick fix please.
Thank you community in advance.
Solved! Go to Solution.
So, perhaps you want something like the following:
Column =
VAR __PromiseDate = 'Table'[PROMISE DATE]
VAR __SupplyDate = 'Table'[Supply_Date]
VAR __TotalSoFar =
SUMX(
FILTER(
'Table',
'Table'[Supply_Date] < EARLIER('Table'[Supply_Date])
),
'Table'[ALLOTTED_QTY]
)
VAR __OrderQty =
SUMX(
FILTER(
'Table',
'Table'[Demand_Order] = EARLIER('Table'[Demand_Order])
),
'Table'[ORDER QTY]
)
VAR __PreText =
SWITCH(
TRUE(),
__TotalSoFar < __OrderQty,"Partial Quantity (" & 'Table'[ALLOTTED_QTY] & ") ",
__TotalSoFar = __OrderQty,"Final Quantity (" & 'Table'[ALLOTTED_QTY] & ") ",
BLANK()
)
VAR __PostText =
SWITCH(
TRUE(),
__SupplyDate < __PromiseDate,"Arriving Early on " & 'Table'[Supply_Date] & " for " & 'Table'[Demand_Order],
__SupplyDate > __PromiseDate,"Arriving Late on " & 'Table'[Supply_Date] & " for " & 'Table'[Demand_Order],
BLANK()
)
RETURN
__PreText & __PostText
PBIX is attached.
Try like
Cal remaining = sumx('Table','Table'[ORDER QTY])-sumx(filter('Table','Table'[ORDER-LINE]=EARLIER('Table'[ORDER-LINE]) && 'Table'[Supply_Date]<=EARLIER('Table'[Supply_Date])),'Table'[ALLOTTED_QTY])
Add additional filter like demand order if needed
Couple necessary fixes to the right supply date field and an equals sign. I think I got your change right as well, PBIX attached.
Column =
VAR __PromiseDate = 'Table'[PROMISE DATE]
VAR __SupplyDate = 'Table'[SupplyDate]
VAR __TotalSoFar =
SUMX(
FILTER(
'Table',
'Table'[SupplyDate] <= EARLIER('Table'[SupplyDate]) &&
'Table'[ORDER-LINE] = EARLIER('Table'[ORDER-LINE])
),
'Table'[ALLOTTED_QTY]
)
VAR __OrderQty =
SUMX(
FILTER(
'Table',
'Table'[Demand_Order] = EARLIER('Table'[Demand_Order]) &&
'Table'[ORDER-LINE] = EARLIER('Table'[ORDER-LINE])
),
'Table'[ORDER QTY]
)
VAR __PreText =
SWITCH(
TRUE(),
__TotalSoFar < __OrderQty,"Partial Quantity (" & 'Table'[ALLOTTED_QTY] & ") ",
__TotalSoFar = __OrderQty,"Final Quantity (" & 'Table'[ALLOTTED_QTY] & ") ",
BLANK()
)
VAR __PostText =
SWITCH(
TRUE(),
__SupplyDate < __PromiseDate,"Arriving Early on " & 'Table'[Supply_Date] & " for " & 'Table'[Demand_Order],
__SupplyDate > __PromiseDate,"Arriving Late on " & 'Table'[Supply_Date] & " for " & 'Table'[Demand_Order],
BLANK()
)
RETURN
IF(ISBLANK(__SupplyDate),[Supply_Date],__PreText & __PostText)
I do not see a way of doing this without an index or date column or some other way of identifying rows that are earlier than other rows. If you had that, you could create your column with EARLIER. See my article on Mean Time Between Failure (MTBF) which uses EARLIER: http://community.powerbi.com/t5/Community-Blog/Mean-Time-Between-Failure-MTBF-and-Power-BI/ba-p/3395...
Hi Greg,
Thanks a ton for your quick reply.
Actually I am currently facing a issue with my Power BI File.
My situation is as follows:
I have following sample table:
| ORDER-LINE | ORDER QTY | Demand_Order | ALLOTTED_QTY | PROMISE DATE | Supply_Date |
| SO-AB1234/1 | 100 | SO-AB1234/1 | 20 | April01 2020 | March10 2020 |
| SO-AB1234/1 | SO-AB1234/1 | 30 | April01 2020 | March20 2020 | |
| SO-AB1234/1 | SO-AB1234/1 | 40 | April01 2020 | April20 2020 | |
| SO-AB1234/1 | SO-AB1234/1 | 10 | April01 2020 | May15 2020 |
Now when we order parts, they sometime arrive in batches and i want to populate a message whenever the parts arrive (i.e. Supply_Date) before the Promise Date or after the Promise Date.
I thought that the solution for that could be to calculate another column which shows the balance quantity and message like:
Partial Quantity (20) Arriving Early on March10 2020 for SO-AB1234/1
Partial Quantity (30) Arriving Early on March20 2020 for SO-AB1234/1
Partial Quantity (40) Arriving Late on April20 2020 for SO-AB1234/1
Final Quantity (10) Arriving Late on May15 2020 for SO-AB1234/1
Not sure if this is the best way.
@amitchandak helped me with following Calculated Column :
Message = if([TOTAL_SHIPPED_QTY]>=[ORDER QTY]
, "FULL QUANTITY SHIPPED" ,
if(not(ISBLANK([Supply_Date])),
if([QTY_DIFFERENCE]>0
&& [REMAIN_QTY]=[ALLOTTED_QTY] , "Full Quantity" & "(" & [ALLOTTED_QTY] & ")" & " Arriving on" & " " & [Supply_Date] & " " & "for" & [ORDER-LINE] ,
if([REMAIN_QTY]>[ALLOTTED_QTY] && [QTY_DIFFERENCE]>0 ,
"Partial Quantity" & "(" & [ALLOTTED_QTY] & ")" & " Arriving on" & " " & [Supply_Date] & " " & "for" & [ORDER-LINE] ,
if([REMAIN_QTY]>[ALLOTTED_QTY] && [QTY_DIFFERENCE] = 0 &&
"Final Quantity" & "(" & [ALLOTTED_QTY] & ")" & " Arriving on" & " " & [Supply_Date] & " " & "for" & [ORDER-LINE]
, "NO SUPPLY DATE",[ALERT])
))))and advised to relook at the REMAIN_QTY logic.
I am still not able to fix the query.
The query still shows output table as:
| ORDER-LINE | PROMISE DATE | Supply_Date | Demand_Order | ORDER QTY | ALLOTTED_QTY | QTY_DIFFERENCE | REMAIN_QTY | TOTAL_SHIPPED_QTY | ALERT | Message |
| SO-AB1234/1 | April01 2020 | March10 2020 | SO-AB1234/1 | 100 | 20 | 80 | 100 | 0 | Early | Partial Quantity(20) Arriving on 03/10/2020 forSO-AB1234/1 |
| SO-AB1234/1 | April01 2020 | March20 2020 | SO-AB1234/1 | 30 | 50 | 0 | 0 | Early | NO SUPPLY DATE | |
| SO-AB1234/1 | April01 2020 | April20 2020 | SO-AB1234/1 | 40 | 10 | 0 | 0 | Late | NO SUPPLY DATE | |
| SO-AB1234/1 | April01 2020 | May15 2020 | SO-AB1234/1 | 10 | 0 | 0 | 0 | Late | NO SUPPLY DATE |
here is the Power BI File link:
https://drive.google.com/open?id=1j64FMJeZQsZBNDkmL_mDgYsWzbYP10GI
Being a super user I am sure you definately have a solution to my problem.
Looking forward for your help please.
Try like
Cal remaining = sumx('Table','Table'[ORDER QTY])-sumx(filter('Table','Table'[ORDER-LINE]=EARLIER('Table'[ORDER-LINE]) && 'Table'[Supply_Date]<=EARLIER('Table'[Supply_Date])),'Table'[ALLOTTED_QTY])
Add additional filter like demand order if needed
Hi Amit & Greg,
Your Solution worked perfect. However I have and additional situation where Supply_Date is not a date column, it also has text (such as STOCK, No Supply) in my original data table. I have added copy of the Supply_Date (SupplyDate) and replaced error with null.
Sadly with this addition, the expected results have changed completely.
Kindly have a look at the updated PBIX file from below link please.
https://drive.google.com/open?id=1Fp8D9cjydsl8F9te66dBW9_V3pwrRSlY
Sorry for the trouble.
Thank you very for your help and valuable time.
Best regards,
Pankajj
OK, I put a simple check in to see if SupplyDate is blank and return blank if so. Technically you could make this anything you wanted in the RETURN but I wasn't entirely certain what you wanted displayed if there is no SupplyDate. Updated PBIX attached.
Column =
VAR __PromiseDate = 'Table'[PROMISE DATE]
VAR __SupplyDate = 'Table'[SupplyDate]
VAR __TotalSoFar =
SUMX(
FILTER(
'Table',
'Table'[Supply_Date] < EARLIER('Table'[Supply_Date])
),
'Table'[ALLOTTED_QTY]
)
VAR __OrderQty =
SUMX(
FILTER(
'Table',
'Table'[Demand_Order] = EARLIER('Table'[Demand_Order])
),
'Table'[ORDER QTY]
)
VAR __PreText =
SWITCH(
TRUE(),
__TotalSoFar < __OrderQty,"Partial Quantity (" & 'Table'[ALLOTTED_QTY] & ") ",
__TotalSoFar = __OrderQty,"Final Quantity (" & 'Table'[ALLOTTED_QTY] & ") ",
BLANK()
)
VAR __PostText =
SWITCH(
TRUE(),
__SupplyDate < __PromiseDate,"Arriving Early on " & 'Table'[Supply_Date] & " for " & 'Table'[Demand_Order],
__SupplyDate > __PromiseDate,"Arriving Late on " & 'Table'[Supply_Date] & " for " & 'Table'[Demand_Order],
BLANK()
)
RETURN
IF(ISBLANK(__SupplyDate),BLANK(),__PreText & __PostText)
Hi Greg!
This is perfect, I have replaced Blank() with [Supply_Date].
One more thing, the column is still showing Partial Quantity (10) Arriving Late on May15 2020 for SO-AB1234/1 instead of Final Quantity(10) Arriving on May15 2020 forSO-AB1234/1.
Kindly check.
Sorry Im asking too much.
Couple necessary fixes to the right supply date field and an equals sign. I think I got your change right as well, PBIX attached.
Column =
VAR __PromiseDate = 'Table'[PROMISE DATE]
VAR __SupplyDate = 'Table'[SupplyDate]
VAR __TotalSoFar =
SUMX(
FILTER(
'Table',
'Table'[SupplyDate] <= EARLIER('Table'[SupplyDate]) &&
'Table'[ORDER-LINE] = EARLIER('Table'[ORDER-LINE])
),
'Table'[ALLOTTED_QTY]
)
VAR __OrderQty =
SUMX(
FILTER(
'Table',
'Table'[Demand_Order] = EARLIER('Table'[Demand_Order]) &&
'Table'[ORDER-LINE] = EARLIER('Table'[ORDER-LINE])
),
'Table'[ORDER QTY]
)
VAR __PreText =
SWITCH(
TRUE(),
__TotalSoFar < __OrderQty,"Partial Quantity (" & 'Table'[ALLOTTED_QTY] & ") ",
__TotalSoFar = __OrderQty,"Final Quantity (" & 'Table'[ALLOTTED_QTY] & ") ",
BLANK()
)
VAR __PostText =
SWITCH(
TRUE(),
__SupplyDate < __PromiseDate,"Arriving Early on " & 'Table'[Supply_Date] & " for " & 'Table'[Demand_Order],
__SupplyDate > __PromiseDate,"Arriving Late on " & 'Table'[Supply_Date] & " for " & 'Table'[Demand_Order],
BLANK()
)
RETURN
IF(ISBLANK(__SupplyDate),[Supply_Date],__PreText & __PostText)
Hi Greg,
This works perfect now.
Have tried it with my big data set and runs smoothly.
Thanks a ton for your support. 🙏
You are a genius!
So, perhaps you want something like the following:
Column =
VAR __PromiseDate = 'Table'[PROMISE DATE]
VAR __SupplyDate = 'Table'[Supply_Date]
VAR __TotalSoFar =
SUMX(
FILTER(
'Table',
'Table'[Supply_Date] < EARLIER('Table'[Supply_Date])
),
'Table'[ALLOTTED_QTY]
)
VAR __OrderQty =
SUMX(
FILTER(
'Table',
'Table'[Demand_Order] = EARLIER('Table'[Demand_Order])
),
'Table'[ORDER QTY]
)
VAR __PreText =
SWITCH(
TRUE(),
__TotalSoFar < __OrderQty,"Partial Quantity (" & 'Table'[ALLOTTED_QTY] & ") ",
__TotalSoFar = __OrderQty,"Final Quantity (" & 'Table'[ALLOTTED_QTY] & ") ",
BLANK()
)
VAR __PostText =
SWITCH(
TRUE(),
__SupplyDate < __PromiseDate,"Arriving Early on " & 'Table'[Supply_Date] & " for " & 'Table'[Demand_Order],
__SupplyDate > __PromiseDate,"Arriving Late on " & 'Table'[Supply_Date] & " for " & 'Table'[Demand_Order],
BLANK()
)
RETURN
__PreText & __PostText
PBIX is attached.
Hi Greg!
This is amazing.
Thanks a ton for your help.
You guys are the rockstars of this community!
Check out the April 2026 Power BI update to learn about new features.
If you have recently started exploring Fabric, we'd love to hear how it's going. Your feedback can help with product improvements.
A new Power BI DataViz World Championship is coming this June! Don't miss out on submitting your entry.
| User | Count |
|---|---|
| 48 | |
| 46 | |
| 41 | |
| 20 | |
| 17 |
| User | Count |
|---|---|
| 69 | |
| 67 | |
| 32 | |
| 27 | |
| 26 |