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
PavelR
Solution Specialist
Solution Specialist

YTD last year DAX

Hi,

 

I have question about YTD Last year DAX formula. Even though I have read many blogs and topics here in community, I still don't know how to solve this issue.

Suppose I have data like below.

 

IDDateAmount
101.01.201610
202.01.201615
303.01.201611
410.01.20168
520.02.20167
601.01.201710
702.01.201712
803.01.20179

 

I would like to figure up YTD value of amount for actual data (year 2017) and then YTD value for corresponding period previous year.

 

For YTD I use formula:

 

YTD = CALCULATE(SUM(Data[Amount]);DATESYTD(Date[Date]))

 

For YTD LY I use formula:

 

YTD LY = CALCULATE([YTD];SAMEPERIODLASTYEAR(Date[Date]))

 

Then when I use these formulas in PBI, I have got incorrect value for YTD LY. I expect value 36 (dates: 1.1. - 3.1. 2016), but in total I have got 44 (it also calculates Amount 8 in 10.1.2016) - so it gives me period of january 2016, but I want only the corresponding days from 2017.

But YTD LY value in pic below on row for 3.1.2017 is OK.

 

YTD_LY.PNG

 

Does anybody know the solution?

 

Thanks.

Regards.

Pavel

1 ACCEPTED SOLUTION

@PavelR

 

It should work fine in Power BI.

You didn't have any dates in your Data table beyond 3 Jan 2017 did you?

 

Here is a sample PBIX file with your data posted above where the measure is working:

PBIX file

 

I made a small change to the YTD measure so that it is not displayed after the max date in Data table, but the YTD LY measure is the same as I posted.

 

Have a play with that - there must be some difference in your model if it is not working.

 

Owen


Owen Auger
Did I answer your question? Mark my post as a solution!
Blog
Twitter
LinkedIn

View solution in original post

55 REPLIES 55
LuisGM7
New Member

Hello Friends,

 

I am trying to calculate YTD from previous years, 2022, 2021, 2020.... I dont want to show the full year amount but compare against current YTD, for example Today 4/APR/2023 against 4/APR/2022/2021/2020... Etc, i am connected to a DataSet hence I cannot modify the model but create DAX measures locallly. I will appreciate any input, help from your side. 

Thank you. 

Luis

Hi,

The measure should be something like this

YTD sales LY = calculate([sales],datesytd(calendar[date],"31/12"))

To the slicer drag Year from the Calendar Table and select a year. To your visual, drag Month name from the Calendar Table.


Regards,
Ashish Mathur
http://www.ashishmathur.com
https://www.linkedin.com/in/excelenthusiasts/
Jith_Raphael
Frequent Visitor

Step 1. find YTD = TOTALYTD([Total Sales],CALENDAR[Period],"3/31") - for FY from April-March.

 

Step 2.

VAR MAXDATE =MAX(CALENDAR'[Period])

RETURN

CALCULATE([TOTAL YTD],SAMEPERIODLASTYEAR(DATESBETWEEN(CALENDAR[Period],BLANK(),MAXDATE)))

rajkmr2195
Regular Visitor

Total YTD = CALCULATE(SUM(Sheet1[Value]),FILTER('DimDate','DimDate'[Year]))
This will  give individual year of YTD .
 

rajkmr2195,
Thank you for this formula, very useful and beautifuly made 🙂

Carlos

Blackworms
Frequent Visitor

First of, thanks for all the help on the issue @OwenAuger however, I have a problem which I couldn't resolve at all since I am kind of beginner with DAX.

 

My dataset has unique Sales Year-Month-Day values from 01.01.2016 to 05.20.2017 in date format and was related with a Calendar Date column which ends at 05.20.2017 as well since it's the last data collection date.

 

First I was struggling to compare MoM for 2016 and 2017 sales. For example, May of 2017 contains only 20 days of data and I wanted to compare the same date range for May of 2016; however, it was fetching all the 2016 data till the end of the year. I solved that issue with your explanation.

 

For this year sales I used: 

 

This Year Sales = CALCULATE(SUM([SalesRevenue]);DATESYTD('Calendar'[Date].[Date]))

 

And for last year sales:

Last Year Sales = 
VAR DataMaxDate =
    CALCULATE ( MAX ( 'Calendar'[Date] ); ALL ( 'Calendar'[Date] ) )
RETURN
    CALCULATE (
        [This Year Sales];
			SAMEPERIODLASTYEAR (
            INTERSECT (
                VALUES ( 'Calendar'[Date].[Date] );
                DATESBETWEEN ( 'Calendar'[Date].[Date]; BLANK (); DataMaxDate )
            )
        )
    )

  

Since my intention was comparing apples to apples, this was the result I was looking for. I finally was able compare the first 20 days of May 2016 and first 20 days of May 2017. 

 

 

However, now I am not able to visually filter any of the months. I mean, when I click Last Year Sales, it's automatically accumulating This Year Sales as well. Please see below:

 

My intention is:

1. To be able to individually filter every year's sales like I was able to before.

2. If I cannot filter individually because of the formulas I used, I am kind of looking for a new way to compare last year's and this year's sales. Like I mentioned, last data date must be taken into account for last year's datas.

3. I created a different Calendar.[Date] and columns related with my sales date data. (Format is in date like 01.01.2016)

 

Thanks for all the help, rgrds,

@Blackworms

When you have a clustered column chart with two or more measures as Value fields, visual filters resulting from clicking on the bars are applied to the axis field.

 

In your example, the visual filter is applied to the month dimension on the axis to include only "May", but both measures are still visible.

 

You can de-emphasise bars for a particular measure by clicking on the legend, but this can't be done simultaneously with an axis dimension filter. Also, I don't think this 'filters' any other visual in any way.

 

Also I couldn't work out what the $3.68m represents. Are you saying that's the total of Last Year Sales and This Year Sales?

 


Owen Auger
Did I answer your question? Mark my post as a solution!
Blog
Twitter
LinkedIn
OwenAuger
Super User
Super User

@PavelR

 

It sounds like you want your YTD LY measure to detect the last date that appears in your Data table, and only translate dates up to that date back to last year within SAMEPERIODLASTYEAR.

 

You can use a pattern like this (note the distinction between Data[Date] which I assume is a column of Data, and Date[Date]):

 

YTD LY (limited by last date in Data table) =
VAR DataMaxDate =
    CALCULATE ( MAX ( Data[Date] ), ALL ( Data ) )
RETURN
    CALCULATE (
        [YTD],
        SAMEPERIODLASTYEAR (
            INTERSECT (
                VALUES ( Date[Date] ),
                DATESBETWEEN ( Date[Date], BLANK (), DataMaxDate )
            )
        )
    )

DataMaxDate is the global maximum date in your Data table. You can define it differently if you want to apply different logic.

 

Cheers,

Owen 🙂


Owen Auger
Did I answer your question? Mark my post as a solution!
Blog
Twitter
LinkedIn
PavelR
Solution Specialist
Solution Specialist

Hi @OwenAuger, thanks for your response,

 

when I implement your measure to PBI I get the same value of 44, as in previous YTD LY measure. Am I wrong with something? Is there some additional prerequisite in PBI or something?

 

Thanks and regards

Pavel

 

@PavelR

 

It should work fine in Power BI.

You didn't have any dates in your Data table beyond 3 Jan 2017 did you?

 

Here is a sample PBIX file with your data posted above where the measure is working:

PBIX file

 

I made a small change to the YTD measure so that it is not displayed after the max date in Data table, but the YTD LY measure is the same as I posted.

 

Have a play with that - there must be some difference in your model if it is not working.

 

Owen


Owen Auger
Did I answer your question? Mark my post as a solution!
Blog
Twitter
LinkedIn

Hi Owen

I had the same probleme and it caused me quite a headache. 

Your solution helped me a lot. Many thanks for that.

All I need to do now is to understand the mechanics properly.

Thanks again.

@Anonymous 

 

It's working fine, but i want to show whatever date values are there in the last year. In below example i want to display 10.01.2016 as well

 


ID Date Amount
1 01.01.2016 10
2 02.01.2016 15
3 03.01.2016 11
4 10.01.2016 8
5 01.01.2017 10
6 02.01.2017 12
7 03.01.2017 9

 

Is it possible to show please let me know

Anonymous
Not applicable

I used the following formula to find YTD and YTD LY

YTD = CALCULATE(SUM('data'[konto]),
FILTER('year',[Date]>=DATE(YEAR(TODAY()),1,1) && [Date]
<=(DATE(YEAR(TODAY()),MONTH(TODAY()),1)-1)))

 

YTD LY = CALCULATE(SUM('data'[konto]),
FILTER('year',[Date]>=DATE(YEAR(TODAY())-1,1,1) && [Date]
<=(DATE(YEAR(TODAY())-1,MONTH(TODAY()),1)-1)))

when I select year 2018 It only showes me YTD, how can I fix this to look both YTD and YTD LY when year 2018 is selected?

Hi,

 

What exactly are you trying to do?  Describe your question in detail and share some data.


Regards,
Ashish Mathur
http://www.ashishmathur.com
https://www.linkedin.com/in/excelenthusiasts/
Anonymous
Not applicable

Just wanted to say thanks @OwenAuger for your solution . Saved me lot of anxiety and time 🙂

 

@OwenAuger, is it possible to calculate YTD based on fiscal year instead of calendar year (i.e. Starting at Apr 1, instead of Jan 1)?

Hi,

 

The second input of the DATESYTD function is the year end date.  See here.


Regards,
Ashish Mathur
http://www.ashishmathur.com
https://www.linkedin.com/in/excelenthusiasts/

@OwenAuger: I tried your DAX formula and it works, to an extent. It works for the current year. I'm looking to display a table that shows the following three columns: [Year], [YTD], [YTD Last Year].

 

To test your formula I built a simple Excel sheet with two columns: [Sale Date] and [Sales] and populted it with every date between 1/1/2015 and today (8/18/2017) and $1.00 of Sales on each day (hey, makes it easy to test, right?). This table is joined to a fully populated Date table with dates ranging back and forward several years.

 

After adjusting your formula and building my table, I see this:

2017-08-18_10-35-11.jpg

 

2017 is showing correct LYTD value of 231 (one over this year because of Feb. 29 2016) but Year 2016 should show 230. Instead it show 365.

 

Seems LYTD should be a VERY simple calculation in DAX. (MDX had the function ParallelPeriod that made this SUPER EASY!) I've spent hours pouring over blogs, forums and technet and still can't seem to get it.

 

Frustrated.

 

Thanks in advance.

@ToddChitt

 

The requirement from the original post was to createa a "YTD Last Year" measure that restricts the dates for "last year" just in the special case where the current date filter context goes past the last date for which data exists.

 

The reason for even wanting such a measure is that the built-in behaviour of time intelligence functions is to shift the current Date table filter context in some way. So if 2017 is selected on the Date table, the filter context is 1 Jan 2017 to 31 Dec 2017, and "last year" is 1 Jan 2016 to 31 Dec 2016, regardless of whether any data exists relating to particular dates within those years.

 

It sounds like you're wanting something slightly different...

 

Is it correct that you want you YTD Last Year measure to always look at the number of days for which data is present in the "latest" year (2017 in your example), and restrict the date context accordingly when shifting back dates not only from 2017 but also 2016 or any earlier year?

 

Is this because in your model, "YTD" is defined relative to the actual date when the model is refreshed (i.e. today in the real world), rather than the current date filter context?

 

 

Would you still want the YTD measure to behave as they currently are, or also restrict all years based on the latest year?

 

It can all be done, just a matter of defining the desired behaviour of the measures.

 

Regards,

Owen


Owen Auger
Did I answer your question? Mark my post as a solution!
Blog
Twitter
LinkedIn

@OwenAuger:

Thanks for the reply.

>Is it correct that you want you YTD Last Year measure to always look at the number of days for which data is present in the "latest" year (2017 in your example), and restrict the date context accordingly when shifting back dates not only from 2017 but also 2016 or any earlier year?<

Not exactly. YTD should look at the current date, and apply that respective end date to the previous years. If today is the 22nd of August, there is no fact data beyond today, and for prior years I would expect to see data from 1/1/2016 up through 8/22/2016, and likewise 1/1/2015 up through 8/22/2015, and on down the years. Come September 2, 3, and 4, (Labor Day holiday weekend in the US) there will be no fact data generated, but the filter context should be current date, not the last date for which we have data.

 

I'm usually pretty good with DAX but this one seems to have me stumped. I do have YTD measure defined as follows:

YTD = TOTALYTD ( [Base Measure], 'Dates'[Date] )

 

Thanks in advance.

-Todd

 

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.