Forum Discussion

denpries's avatar
denpries
Resolver I
8 years ago
Solved

Which dax statement is more efficient?

 

Dear users.

 

I was wondering, while building a piece of DAX, if i could improve it or not. Below is a formula i use to calculate the sales in period 1, starting at P1 start and ending at P1 end.

 

P1 Sales = CALCULATE([Sales];DATESBETWEEN(DateTable[Dates];[P1 start];[P1 end]))

 

 

The second argument might lead to a table of e.g. 365 rows, if i have P1 start at Januari 1st, and P1 end at December 31st.

 

As i know the sales table ALWAYS ONLY has sales at the 1st of the month, i thought, why not have the second argument filtered?

Sales is a table of 500k rows by the way. 

 

P1 Sales* = CALCULATE([Sales];filter(DATESBETWEEN(DateTable[Datum];[P1 start];[P1 end]);day(DateTable[Datum])=1))

 

or:

P1 Sales* = CALCULATE([Sales];DATESBETWEEN(DateTable[Datum];[P1 start];[P1 end]);day(DateTable[Datum])=1)

 

So this way i pass as filter to CALCULATE only 12 days, namely the 1st day of every month. 

 

Would this speed matters up? Or is this hypothetical BS and do i just creat more overhead? :P

 

 

5 Replies

  • Greg_Deckler's avatar
    Greg_Deckler
    Community Champion

    Perhaps:

     

    P1 Sales = 
    VAR tmpDates = FILTER(FILTER(DateTable,DAY([Dates])=1),[Dates]>=[P1 start] && [Dates]<=[P1 end)
    RETURN SUMX(tmpDates,[Sales])
    • denpries's avatar
      denpries
      Resolver I

       

      Greg_Deckler that also works, yes. If i understand it correctly you filter from the dates table all applicable rows (so basically 1 per month) and then sumx evaluates the [sales] for every row of that table and adds it together.

      What i dont understand yet, and try to know why, if this approach is more efficient then the other.

       

      • denpries's avatar
        denpries
        Resolver I

        Anybody else with an opinion about this / some more in depth knowledge?