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

Earn the coveted Fabric Analytics Engineer certification. 100% off your exam for a limited time only!

Reply
lingvistt
Frequent Visitor

MAT for custom time format

Hi all,

 

I have my own custom time frame where every year is splitted in 13 4-week time periods.

 

Year4-week time period
20181
20182
20183
20184
20185
20186
20187
20188
20189
201810
201811
201812
201813

 

I have 2 tasks based on it:

- I would like to make 'MAT' measure, which will calculate moving averages based on this data

(e.g. MAT for 2018'7 is equal to 2017'8+2017'9+2017'10+...+2018'6+2018'7).

- To calculate 'MAT growth'

(e.g. 'MAT growth' for 2018'7 is equal to 'MAT' for 2018'7 divided by 'MAT' for 2017'7)

 

Hope, someone has come across such a case and solved it 🙂 Thanks Smiley Happy

1 ACCEPTED SOLUTION
Anonymous
Not applicable

No worries, there is always a way!

 

Back in our table, I added a "Product" column with "Apple, Banana, Pear".  Now, what we need to do is modify that "Index" column not to just look at the Year4WkID, but also the Product.  Our new code:

Index = 
Var CurrentYrWk= MAT[Year4wkID]
VAR CurrentProduct= MAT[Product]
RETURN
CALCULATE(
    COUNTROWS(
        FILTER( ALL ( 'MAT'),
        MAT[Year4wkID] <= CurrentYrWk
        && MAT[Product] = CurrentProduct
        )
    )
)

This will give us the count of rows of all the rows that that are less than or equal to the current row's Year4WkId AND where the currrent row's Product is the same:

Table with Product.png

 

Need to modify the MAT code as well:

MAT = 
IF( MAX( MAT[Index]) >=12,
        AVERAGEX(
        FILTER(
             ALLEXCEPT(MAT,MAT[Product]),
                MAT[Index] <= MAX(MAT[Index])
                    && MAT[Index] >= MAX(MAT[Index])-11
        ),
    [MAT Sales]
   ),
 "Not Enough Data"
)
  • Got rid of the countrows to check for enough data, have that # available via the Idex column.  I used max in order to make the grand totals work as well
  • Want to use ALLEXCEPT instead of ALL.  This tells dax to ignore all the filteres except the one placed on product Final Table, multiple products.png

 

I think that is what may have had in mind?

 

View solution in original post

7 REPLIES 7
v-jiascu-msft
Employee
Employee

Hi @lingvistt,

 

Could you please mark the proper answers as solutions?

 

Best Regards,

Dale

Community Support Team _ Dale
If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.
Anonymous
Not applicable

See if this helps:

  1. Need to create a unique ID in your table.  

 

Year4wkID = 'MAT'[Year]*100+MAT[4-week time period]

 1s calc col.png

2. Using that column, create an Index where we can "go back in time".  This will count how many rows are less than or equal to the current row:

 

Index = 
Var CurrentYrWk= MAT[Year4wkID]
return
CALCULATE(
    COUNTROWS(
        FILTER( ALL ( 'MAT'),
        MAT[Year4wkID] <= CurrentYrWk
        )
    )
)

Index col.png

 

 

Now we have the data in the table that we can use to write a measure:

here's the basic measure (  i added in "Sales" to be able to work with):

 

MAT Sales = SUM ( MAT[Sales])

MAT = 
AVERAGEX(
	FILTER(
		ALL(MAT),
			MAT[Index] <= MAX(MAT[Index])
			    && MAT[Index] >= MAX(MAT[Index])-11
   	 ),
    [MAT Sales]
)
    

 

Though, probably want to check to see if there is enough data for an average.  So added in a countrows to check to be sure there is enough data:

MAT = 
IF(
 CALCULATE(
    	COUNTROWS( 
    	    FILTER(
		ALL(MAT),
		  AT[Index] <= MAX(MAT[Index])
    		    && MAT[Index] >= MAX(MAT[Index])-11
       	 )
       	)
     )>=12,
	AVERAGEX(
    	 FILTER(
	   ALL(MAT),
	     MAT[Index] <= MAX(MAT[Index])
    		  && MAT[Index] >= MAX(MAT[Index])-11
   	    ),
    [MAT Sales]
    ),
 "Not Enough Data"  /*Dont need anythign here, added this for illustration purposes*/
)

Final Table:

MAT table.png

 

Was longer that I anticipated, but think a good start. (or at least I hope Smiley Wink )

Hi Nick_M, Thanks for your intention to help and to the solution proposed. While trying to copy it I have come across a problem with the 2nd formula 🙂 Could you look at it please?

 

https://drive.google.com/open?id=1NIF36ICubEAaAJsMDPcqPiJ9VANudeBp

https://drive.google.com/open?id=1et5LqxwHL3f0Hqxap62Nr9VU7KcoZu5E

https://drive.google.com/open?id=1BlBol12o9YwsHQV7wTQ0NsTCRNTPrGaM

Anonymous
Not applicable

Looks like you are trying to use it as a Measure, it needs to be a Calculate Column in your table.  Calculated Columns have row context, which is why you do not get the error, while measures need to have row context invoked by the "X" functions.  So when you put that 2nd formula into a mesure DAX doesn't "know" what row(s) it should be looking at and errors out

Nick_M, I was a bit in a hurry with positive conslutions Smiley Sad The thing is that the solution you propose works only for the cases when we have one only one row for year time frame (e.g. 2017 1 - only in one row).

 

When I try to apply your method to the dataset where all the data is recorded three times or more, it gives unclear results.

 

Example of the table:

(Year) (Period) (Sales Value) (Product)

2016 1 100.0 Apple

2016 2 200.0 Apple

...

...

...

2016 1 50.0 Orange

...

...

2016 1 30.0 Tomato

 

The result:

https://drive.google.com/open?id=1mkt5E-dceubSVMXmXCQyx7Lsa-RkESrr

 

Dataset example:

https://drive.google.com/open?id=1wzLIzXFyzWtDozLXGRi6kEPNlT9wB5nY

Anonymous
Not applicable

No worries, there is always a way!

 

Back in our table, I added a "Product" column with "Apple, Banana, Pear".  Now, what we need to do is modify that "Index" column not to just look at the Year4WkID, but also the Product.  Our new code:

Index = 
Var CurrentYrWk= MAT[Year4wkID]
VAR CurrentProduct= MAT[Product]
RETURN
CALCULATE(
    COUNTROWS(
        FILTER( ALL ( 'MAT'),
        MAT[Year4wkID] <= CurrentYrWk
        && MAT[Product] = CurrentProduct
        )
    )
)

This will give us the count of rows of all the rows that that are less than or equal to the current row's Year4WkId AND where the currrent row's Product is the same:

Table with Product.png

 

Need to modify the MAT code as well:

MAT = 
IF( MAX( MAT[Index]) >=12,
        AVERAGEX(
        FILTER(
             ALLEXCEPT(MAT,MAT[Product]),
                MAT[Index] <= MAX(MAT[Index])
                    && MAT[Index] >= MAX(MAT[Index])-11
        ),
    [MAT Sales]
   ),
 "Not Enough Data"
)
  • Got rid of the countrows to check for enough data, have that # available via the Idex column.  I used max in order to make the grand totals work as well
  • Want to use ALLEXCEPT instead of ALL.  This tells dax to ignore all the filteres except the one placed on product Final Table, multiple products.png

 

I think that is what may have had in mind?

 

Nick_M, thanks a lot 🙂 MAT works perfectly!

 

Do you have any ideas about the second part of the question about MAT growth:

 

I have 2 tasks based on it:

- I would like to make 'MAT' measure, which will calculate moving averages based on this data

(e.g. MAT for 2018'7 is equal to 2017'8+2017'9+2017'10+...+2018'6+2018'7).

- To calculate 'MAT growth'

(e.g. 'MAT growth' for 2018'7 is equal to 'MAT' for 2018'7 divided by 'MAT' for 2017'7)

Helpful resources

Announcements
April AMA free

Microsoft Fabric AMA Livestream

Join us Tuesday, April 09, 9:00 – 10:00 AM PST for a live, expert-led Q&A session on all things Microsoft Fabric!

March Fabric Community Update

Fabric Community Update - March 2024

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