Forum Discussion
YTD last year DAX
- 9 years ago
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:
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
@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 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.
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
- ToddChitt9 years ago
Super User
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
- OwenAuger9 years ago
Super User
Got it...the reason your particular measure is not straightforward is that the built in time intelligence functions are designed to perform calculations relative to the selection on the Date table rather than TODAY().
There are multiple ways you could handle this - here is one possibility (code below).
The logic I have used is to
- Get the month/day of TODAY()
- Shift that into the currently filtered year (based on the maximum selected date)
- Create two date filters: YTD based on the shifted date in step 2 & YTD based on the maximum selected date
- Calculate Sales with Date filtered to the intersection of the filters from step 3
The reason for the intersection in step 4 is to handle cases where you are filtering at a lower level than year. So if today is 25-Aug-2017 and you have filtered on Jul-2017 in a visual, the measure would return sales from 1-Jan-2017 to 31-Jul-2017. However if you selected any month from Aug-2017 to Dec-2017, you would get sales from 1-Jan-2017 to 25-Aug-2017.
Sales Amount YTD based on current date = VAR Today = TODAY () VAR TodayMonth = MONTH ( Today ) VAR TodayDay = DAY ( Today ) VAR MaxDateSelectedYear = YEAR ( MAX ( 'Date'[Date] ) ) VAR TodayShiftedToSelectedYear = DATE ( MaxDateSelectedYear, TodayMonth, TodayDay ) RETURN CALCULATE ( [Sales Amount], DATESYTD ( 'Date'[Date] ), CALCULATETABLE ( DATESYTD ( 'Date'[Date] ), 'Date'[Date] = TodayShiftedToSelectedYear ) )Regards,
Owen :)
- jwjwjwjwjw9 years ago
Advocate II
Hello Owen, thanks for all the work on this thread. It has helped me immensely already. Your solution in the previous post works "almost" works for me, except for one error that I can't even begin to imagine the source of.
My data has 6 years, and the "to date" shows up as it should for every year except for 2016. And 2016 is just blank. This isn't a problem with my data, as 2016 shows up just fine in all other visuals/scenarios. Does anything come to mind as to what could be going on?
EDIT: I jumped the gun replying here, I think today's date in 2016 was over the weekend and didn't have any data, but adding the that date via a calendar table with all dates seems to have fixed it.
Thanks again, Owen!