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

Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers. Get Fabric certified for FREE! Learn more

Reply
gvenkatesh_alti
New Member

How to create a calculation group for YoY calculation( 2 measures without using sameperiodlastyear )

Hi Community, 

 

I have 2 measures called TY placed sales and LY placed sales created using base columns TY sales and LY sales. 

I created a measure like below and it is working as expected. 

YoY % (Sales) =
Var a = [TY Placed Sales]
Var b = [LY Placed Sales]
return
IF(ISBLANK(a) || a <=0 || b<=0 , BLANK() , DIVIDE(a-b,b))
 
However, there are lot of KPIs which requires same Yoy calculations. So , instead of creating a seperate measure , i tried creating a calculation group as shown below. 
 
YoY % (BOPIS Sales ) =
Var a = [TY Placed Sales]
Var b = [LY Placed Sales]
return
IF(ISBLANK(a) || a <=0 || b<=0 , BLANK() , DIVIDE(a-b,b))
 
This is not working as expected and not giving any results. 
kindly assist. 
 
 
1 ACCEPTED SOLUTION
Deku
Community Champion
Community Champion

You need to pass in the measure to consider using selectedmeasure(), so need something like

 

Var maxDt = max( date[date] )
Var thisYear= Year( maxDt )
Var a = 
   Calculate(
      Selectedmeasure(),
      Datesbetween( dates[Date], date( thisYear, 1, 1 ), maxDt )
   )
Var b = 
   Calculate(
      Selectedmeasure(),
      DATEADD(Datesbetween( dates[Date], date( thisYear, 1, 1 ), maxDt ), -12, month)
   )
return
IF(ISBLANK(a) || a <=0 || b<=0 , BLANK() , DIVIDE(a-b,b))

Did I answer your question?
Please help by clicking the thumbs up button and mark my post as a solution!

View solution in original post

6 REPLIES 6
v-sgandrathi
Community Support
Community Support

Hi @gvenkatesh_alti,

 

Has your issue been resolved? If the solution provided by the community member effectively addressed your concern, kindly confirm.

We encourage you to mark the response as Accepted Answer and provide Kudos if you found it helpful. This helps us ensure that valuable solutions are shared with the entire community.

Should you have any further questions, please don't hesitate to reach out.

 

Thank you for your understanding.

Hi @gvenkatesh_alti,

 

May I ask if you have gotten this issue resolved?

If it is solved, please mark the helpful reply or share your solution and accept it as solution, it will be helpful for other members of the community who have similar problems as yours to solve it faster.

Thank you.

 

Hi @gvenkatesh_alti,

 

I wanted to check in your situation regarding the issue. Have you resolved it? If you have, please consider marking the reply as Accepted solution and give Kudos that helped you. It would be greatly appreciated by others in the community who may have the same question.

 

Thank you.

rohit1991
Super User
Super User

Hi @gvenkatesh_alti ,
You're on the right track by attempting to simplify repeated YoY calculations using a calculation group, but the reason your current approach isn't working is because you're hardcoding specific measures like [TY Placed Sales] and [LY Placed Sales] inside the calculation group logic. 

 

Calculation groups are designed to be dynamic and work with any measure by leveraging SELECTEDMEASURE(), which represents the measure currently being evaluated in the visual. To achieve the desired YoY % calculation, you should rewrite your calculation group item to use SELECTEDMEASURE() for the current year value, and then calculate the corresponding last year value using filters — for example, by shifting the year or using a "Year Type" column if TY and LY are stored together. This way, your calculation group becomes reusable across all KPIs without needing to reference specific measures, allowing consistent and scalable YoY logic across your report.

 


Passionate about leveraging data analytics to drive strategic decision-making and foster business growth.

Connect with me on LinkedIn: Rohit Kumar

Gokul_G16
Resolver I
Resolver I

Hi @gvenkatesh_alti ,

Please try the following code,

YoY = VAR CurrentYear = YEAR(SELECTEDVALUE('Date'[Date])) VAR PreviousYear = CurrentYear - 1 RETURN CALCULATE( SELECTEDMEASURE(), FILTER( ALL('Date'), 'Date'[Year] = PreviousYear ) )

For YoY%, use this DAX expression: YoY% = VAR CurrentYear = YEAR(SELECTEDVALUE('Date'[Date])) VAR PreviousYear = CurrentYear - 1 VAR CurrentValue = SELECTEDMEASURE() VAR PreviousValue = CALCULATE( SELECTEDMEASURE(), FILTER( ALL('Date'), 'Date'[Year] = PreviousYear ) ) RETURN DIVIDE(CurrentValue - PreviousValue, PreviousValue, 0)

Regards,
Gokul,

If you good with the answer do like me and share your thougths if you not find well...

Deku
Community Champion
Community Champion

You need to pass in the measure to consider using selectedmeasure(), so need something like

 

Var maxDt = max( date[date] )
Var thisYear= Year( maxDt )
Var a = 
   Calculate(
      Selectedmeasure(),
      Datesbetween( dates[Date], date( thisYear, 1, 1 ), maxDt )
   )
Var b = 
   Calculate(
      Selectedmeasure(),
      DATEADD(Datesbetween( dates[Date], date( thisYear, 1, 1 ), maxDt ), -12, month)
   )
return
IF(ISBLANK(a) || a <=0 || b<=0 , BLANK() , DIVIDE(a-b,b))

Did I answer your question?
Please help by clicking the thumbs up button and mark my post as a solution!

Helpful resources

Announcements
Notebook Gallery Carousel1

NEW! Community Notebooks Gallery

Explore and share Fabric Notebooks to boost Power BI insights in the new community notebooks gallery.

April2025 Carousel

Fabric Community Update - April 2025

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

"); $(".slidesjs-pagination" ).prependTo(".pagination_sec"); $(".slidesjs-pagination" ).append("
"); $(".slidesjs-play.slidesjs-navigation").appendTo(".playpause_sec"); $(".slidesjs-stop.slidesjs-navigation").appendTo(".playpause_sec"); $(".slidesjs-pagination" ).append(""); $(".slidesjs-pagination" ).append(""); } catch(e){ } /* End: This code is added by iTalent as part of iTrack COMPL-455 */ $(".slidesjs-previous.slidesjs-navigation").attr('tabindex', '0'); $(".slidesjs-next.slidesjs-navigation").attr('tabindex', '0'); /* start: This code is added by iTalent as part of iTrack 1859082 */ $('.slidesjs-play.slidesjs-navigation').attr('id','playtitle'); $('.slidesjs-stop.slidesjs-navigation').attr('id','stoptitle'); $('.slidesjs-play.slidesjs-navigation').attr('role','tab'); $('.slidesjs-stop.slidesjs-navigation').attr('role','tab'); $('.slidesjs-play.slidesjs-navigation').attr('aria-describedby','tip1'); $('.slidesjs-stop.slidesjs-navigation').attr('aria-describedby','tip2'); /* End: This code is added by iTalent as part of iTrack 1859082 */ }); $(document).ready(function() { if($("#slides .item").length < 2 ) { /* Fixing Single Slide click issue (commented following code)*/ // $(".item").css("left","0px"); $(".item.slidesjs-slide").attr('style', 'left:0px !important'); $(".slidesjs-stop.slidesjs-navigation").trigger('click'); $(".slidesjs-previous").css("display", "none"); $(".slidesjs-next").css("display", "none"); } var items_length = $(".item.slidesjs-slide").length; $(".slidesjs-pagination-item > button").attr("aria-setsize",items_length); $(".slidesjs-next, .slidesjs-pagination-item button").attr("tabindex","-1"); $(".slidesjs-pagination-item button").attr("role", "tab"); $(".slidesjs-previous").attr("tabindex","-1"); $(".slidesjs-next").attr("aria-hidden","true"); $(".slidesjs-previous").attr("aria-hidden","true"); $(".slidesjs-next").attr("aria-label","Next"); $(".slidesjs-previous").attr("aria-label","Previous"); //$(".slidesjs-stop.slidesjs-navigation").attr("role","button"); //$(".slidesjs-play.slidesjs-navigation").attr("role","button"); $(".slidesjs-pagination").attr("role","tablist").attr("aria-busy","true"); $("li.slidesjs-pagination-item").attr("role","list"); $(".item.slidesjs-slide").attr("tabindex","-1"); $(".item.slidesjs-slide").attr("aria-label","item"); /*$(".slidesjs-stop.slidesjs-navigation").on('click', function() { var itemNumber = parseInt($('.slidesjs-pagination-item > a.active').attr('data-slidesjs-item')); $($('.item.slidesjs-slide')[itemNumber]).find('.c-call-to-action').attr('tabindex', '0'); });*/ $(".slidesjs-stop.slidesjs-navigation, .slidesjs-pagination-item > button").on('click keydown', function() { $.each($('.item.slidesjs-slide'),function(i,el){ $(el).find('.c-call-to-action').attr('tabindex', '-1'); }); var itemNumber = parseInt($('.slidesjs-pagination-item > button.active').attr('data-slidesjs-item')); $($('.item.slidesjs-slide')[itemNumber]).find('.c-call-to-action').attr('tabindex', '0'); }); $(".slidesjs-play.slidesjs-navigation").on('click', function() { $.each($('.item.slidesjs-slide'),function(i,el){ $(el).find('.c-call-to-action').attr('tabindex', '-1'); }); }); $(".slidesjs-pagination-item button").keyup(function(e){ var keyCode = e.keyCode || e.which; if (keyCode == 9) { e.preventDefault(); $(".slidesjs-stop.slidesjs-navigation").trigger('click').blur(); $("button.active").focus(); } }); $(".slidesjs-play").on("click",function (event) { if (event.handleObj.type === "click") { $(".slidesjs-stop").focus(); } else if(event.handleObj.type === "keydown"){ if (event.which === 13 && $(event.target).hasClass("slidesjs-play")) { $(".slidesjs-stop").focus(); } } }); $(".slidesjs-stop").on("click",function (event) { if (event.handleObj.type === "click") { $(".slidesjs-play").focus(); } else if(event.handleObj.type === "keydown"){ if (event.which === 13 && $(event.target).hasClass("slidesjs-stop")) { $(".slidesjs-play").focus(); } } }); $(".slidesjs-pagination-item").keydown(function(e){ switch (e.which){ case 37: //left arrow key $(".slidesjs-previous.slidesjs-navigation").trigger('click'); e.preventDefault(); break; case 39: //right arrow key $(".slidesjs-next.slidesjs-navigation").trigger('click'); e.preventDefault(); break; default: return; } $(".slidesjs-pagination-item button.active").focus(); }); }); // Start This code is added by iTalent as part of iTrack 1859082 $(document).ready(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); $("#tip2").attr("aria-hidden","true").addClass("hidden"); $(".slidesjs-stop.slidesjs-navigation, .slidesjs-play.slidesjs-navigation").attr('title', ''); $("a#playtitle").focus(function(){ $("#tip1").attr("aria-hidden","false").removeClass("hidden"); }); $("a#playtitle").mouseover(function(){ $("#tip1").attr("aria-hidden","false").removeClass("hidden"); }); $("a#playtitle").blur(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); }); $("a#playtitle").mouseleave(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); }); $("a#play").keydown(function(ev){ if (ev.which ==27) { $("#tip1").attr("aria-hidden","true").addClass("hidden"); ev.preventDefault(); return false; } }); $("a#stoptitle").focus(function(){ $("#tip2").attr("aria-hidden","false").removeClass("hidden"); }); $("a#stoptitle").mouseover(function(){ $("#tip2").attr("aria-hidden","false").removeClass("hidden"); }); $("a#stoptitle").blur(function(){ $("#tip2").attr("aria-hidden","true").addClass("hidden"); }); $("a#stoptitle").mouseleave(function(){ $("#tip2").attr("aria-hidden","true").addClass("hidden"); }); $("a#stoptitle").keydown(function(ev){ if (ev.which ==27) { $("#tip2").attr("aria-hidden","true").addClass("hidden"); ev.preventDefault(); return false; } }); }); // End This code is added by iTalent as part of iTrack 1859082
Top Solution Authors