Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
palvarez83
Helper I
Helper I

Lookup DateKey from another column's running total?

Hello,

Is there a way to use DAX filter/calculate function combination to return the value froma row from a certain using a running total/cumulative from a different column? I have a table dCaldenar like the following:

 

DateKey               Workday              Productivy

10/1/18                1                              1.4

10/2/18                0                              1.4

…                             …                             …

12/31/19              1                              1.8

 

 

I would like to pass in a date measure to filter that table as follows:

 

Filter(dCalendar, dCalendar[DateKey]>= [DateMeasure] && dCalendar[Workday]=1)

 

 

Then I would like to somehow start summing the dCalender[Productivity] column from the filtered table, like a running total, and return the DateKey for the earlierst row where that running total is greater than or equal to some known value from another measure called [ProductivityNeeded].

 

  1. Is there a way to do that starting summing productivity from the top row downwards?
  2. What if I needed to reverse it? That is start summing from the bottom upwards?

 

Any other suggestions?  Please help.

 

Thanks in advance.

2 ACCEPTED SOLUTIONS

@palvarez83

 

Try adding an ALL() to the base table for the filter as below. Seems to work. Check out if it is so and then we can discuss what was at play.

 

Working Days Given :=
CALCULATE (
    SUM ( dCalendar[Workday] ),
    FILTER (
        ALL(dCalendar),
        dCalendar[Date] >= MIN ( fCommTime[ActualStart] )
            && dCalendar[Date] <= MIN ( fCommTime[ActualEnd] )
            && dCalendar[Workday] = 1
    )
)
    - SUM ( fCommTime[Days Lost] )

 

View solution in original post

@palvarez83

No worries. glad it helped. 

Your code for the measure:

 

Working Days Given :=
CALCULATE (
    SUM ( dCalendar[Workday] ),
    FILTER (
        dCalendar,
        dCalendar[Date] >= MIN ( fCommTime[ActualStart] )
            && dCalendar[Date] <= MIN ( fCommTime[ActualEnd] )
            && dCalendar[Workday] = 1
    )
)
    - SUM ( fCommTime[Days Lost] )

 

When we invoke this measure within the other piece of code, we have a row context from the ADDCOLUMNS. As discussed earlier, I was afraid the context transition would play unwanted tricks. When I initially saw your code, though, it seemed fine because you are using the whole dCalendar table as base table for your filtering operation. That should be enough to override the effects of context transition. BUT, and here comes the interesting part, every time a measure is invoked, the engine wraps the measure in a CALCULATE. You probably are aware of that. So what we effectively have when we call your measure is:

 

CALCULATE (
    CALCULATE (
        SUM ( dCalendar[Workday] ),
        FILTER (
            dCalendar,
            dCalendar[Date] >= MIN ( fCommTime[ActualStart] )
                && dCalendar[Date] <= MIN ( fCommTime[ActualEnd] )
                && dCalendar[Workday] = 1
        )
    )
        - SUM ( fCommTime[Days Lost] )
)

   

The outermost CALCULATE does not have filter arguments and the filter resulting from context transition is applied fully. That filter is the current row of the table (the ADDCOLUMNS table), as you know. Then when the engine executes the inner CALCULATE we have that row as filter and that is applied directly to dCalendar in 

FILTER(dCalendar;....)

The base table for the filter operation is just that one row instead of the full table that we would want. That is why you need the ALL( ).

Does that help?               

View solution in original post

30 REPLIES 30

@AlB,  Thanks again.  I wasn't aware that expanding the measure code had a different behavior than invoking the measure.  So that is a good to know thing as well.

@palvarez83

 

and one thing that we haven't commented on but caught my attention from the beginning: why do you have the 'Productivity' column in your date table, dCalendar?

@AlB,

 

Good question.  I am working on a large project in Asia that is made up of smaller projects (modules) where we have to do some commissisoning one each module after it is built.  We get a forecasted or actual start and end date to do commissioning on each module as a given.  Each module has a planned commissioning duration which right now usual exceeds the given window that we are given.  So I need to answer a few questions.

 

1.  In that given window how much uncomplete work would I have left over for each module?  I compute this as the

( [NeededWorkWorkdays]- [WorkingDaysGiven] ) / [NeededWorkWorkDays] * [Man-hours to be worked]...

 

2.  If there is going to be work left over, by what date in the future could we complewte it?  That/s where you helped me sum working days using the ADDCOLUMNS function.  I pull the calendar table fillter based on dates after the end date I'm given and using a running total I figure out how many working days I need to accumulate and return that date.

 

That was the summing of workdays part.  The zeros represent sundays and public holidays.  Next came the productivity factors summation. 

 

Since we are trying to complete this left over work as quickly as possible, our team has been working overtime 1.4 producitfy factor instead of just 1.0 which represent the assumed working hours baseline.  Then starting certain dates, we are forecasting a partial night shfit to start and give the dayshift guys a break from overtime work ( 1.6 productivyt factor) and then a full night**bleep** at a later date which we assume will only be 80% as productiy as the day shift so you would have 1.8 as that day's productivy.   So the dates which these changes in producity happen apply across all modules.  So I imported them from an excel table, merged these factors onto the calendar table using power query by matching dates and filled downwards.  Then any remaining null values got replaced with 1.0 (default)

 

By summing  the daily producity factors  from the calendar table filtered for working days only, I can answer the same questions as above, for the nightshift scenario:  How much work will be leftover and if given an extension, up until which date I would need it.  This would help us forecast when we actually need nightshift to complete the work. 

 

Since the productiy factor is an assumption that depends on date only and is to be referenced in 4 different calculations for each module, it made sense to have it in the Calendar table.   One possible improvement I might do next is adjust producity factors based on how many simulaneous modules are available to work on on a given date, but this is good enought for now.  Perhaps there would have been a more efficent way of doing this, but I'm reactiving to what I have and it has been a fun experience for me to start learning DAX, powerquery, and Power Bi. 

 

Thank you for all your help!

@palvarez83

Alright. Interesting challenge.

So how about some kudos maybe Smiley Wink?

@AlB,  Done.  Kudos given.  🙂

@palvarez83

 

Smiley Very HappySmiley Very Happy Smiley Very HappyWow, that was a bit over the top. Thanks

@palvarez83

If you don't know the Italian gurus yet, they have a wealth of very interesting stuff here.

Their articles/blogs and books on DAX are really good. 

@palvarez83

I was wondering, are the filtering conditions

 

dCalendar[Date] > DATE ( 2019, 1, 11 )
                    && dCalendar[Workday] = 1

 fixed? If they are not and you're interested in seeing the results for other scenarios I think it would be better to do the filtering through slicers. Then you can change the conditions dynamically.    

@AlB

 

dCalendar[Workday] = 1 is a fixed condition.

 

dCalendar[Date] > DATE ( 2019, 1, 11 ) wiill be replaced by a measure dCalendar[Date] > [DateNeeded].  That measure does not seem to be affected by context transition in what I am trying to do now.

 

 

@palvarez83

On your question regarding the semicolons and the commas, I'm not positive but I believe it has to do with your machine's locale settings. If it's US or others that don't use the comma as decimal point, it will be comma for the code. Otherwise it will be "; ". 

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.