PowerBI: SAMEPERIODLASTYEAR function not working - powerbi

I am getting the following error message when I write the below code:
Value for 'Total Sales'cannot is determined. Either 'Total Sales' does not exist or there is no current row for a column named 'Total Sales'
enter code here
LYSales = CALCULATE([Total Sales],SAMEPERIODLASTYEAR('Date'[Date]))
How do I fix this? I have the Total Sales column with data. It is set to general currency.

Written in this way your formula is not referencing a measure, not a column, also you will need an expression inside calculate.
-- This reference a Measure, which in your case is not defined
LYSales = CALCULATE([Total Sales],SAMEPERIODLASTYEAR('Date'[Date]))
-- you can create it with this formula
Total Sales = SUM('_TableName_'[Total Sales])
--The other way is to use only one formula
LYSales = CALCULATE(SUM('_TableName_'[Total Sales]),SAMEPERIODLASTYEAR('Date'[Date]))
As a note, to use time intelligence functions you need to mark the calendar table as "date table": right click on the table -> "Mark as Date Table"

The calculation looks at the table column as a whole. Your formula uses the value in the current row of the column. So, change it to
LYSales = CALCULATE('Your Table Name'[Total Sales],SAMEPERIODLASTYEAR('Date'[Date]))

Related

IF 'AND-OR' ISFILTERED combination in DAX giving problems

Below is the sample dataset
The data has two slicers ( date and category ) shown below
I am writing a DAX Statement to multiply the sum(values) * 10 only if the date range is in the current year 2023.
The StartYear gives the start of the current year, firstD gives the lowest date from the date slicer.
Formula =
var new = sum(Test[Value]) * 10
var startyear = DATE(YEAR(TODAY()),1,1)
var firstD = CALCULATE( MIN( Test[Date]), ALLSELECTED(Test[Date]) )
return if( ISFILTERED(Test[Categories]) && firstD >= startyear, new, 0 )
Now when I filter dates to 2023, the total value should be 2300 but it shows as 0
However the DAX works when I select A or B
If we remove the ISFILTERED function then, it gives wrong value, the expected value is 0 because the start date is in 2022, but it shows 650
let me know if that is the right syntax
It looks like you are not using a separate calendar table to handle this, which you need!
In your very last example you have set your slicer to some time late 2022, but the minimum value of 'Test'[Date] for your selected category is in year 2023. Hint: set the slicer to e.g. 2022-12-14, this will include a 2022-date for Category A in your data.
Your measure behaves exactly how it is supposed to, in other words!
To fix this, you need to do the following:
Create a calendar table in your model, this should contain contiguous dates, which is necessary for the filtering method you want
Establish a relationship between the calendar table and existing Test table.
Use the date column from your new calendar table in your slicer and as date reference in your measure
Exactly how to create a calendar table is thoroughly documented on Google, I recommend you search and find an article or video you understand for implementing this.
Lastly: Your use of ISFILTERED in this measure seems strange, since you mention nowhere the requirement of only showing a number if the column you are testing filtering on is filtered, if that makes sense.. :-) The way you describe your calculation, you only need to check whether the selected date range starts in current year.

Add previous month column DAX Power BI

I have a fact table which has 'Last Data Update' column that shows current month date(mm/dd/yyyy), 06/13/2022.
I am trying to add column called 'report month' that returns a value that shows previous month/year 05/2022 to create relationship with calendar table.
=Date.Month([Last Data Update])-1
I have used this code, but this only returns 5 and it is in number format.
is there a way to return 05/2022 in DAX ?
Thanks in advance.
This is M, not DAX. Replace your custom column with the following code:
Text.PadStart( Text.From(Date.Month([Last Data Update])-1),2,"0") &"/"& Text.From(Date.Year([Last Data Update]))
It worked for we with this 3 simple steps:
Step 1: Create a column with current year (True/False statement) by using:
CurrentYear = IF(YEAR([Last Data Update])=YEAR(NOW()),1,0)
Step 2: Create a column that will indicate if the current date (based on column "Last Data Update") belongs to previous month or not (True/False statement).
PreviousMonth = IF([CurrentYear]=1 && (MONTH(TODAY())-1)=MONTH([Last Data Update]),1,0)
Step 3: Create a filter on your visual where you select filter "PreviousMonth" with value "1" to show dates only from previous month).
If you like it. Don't forget to rate it.
Success,
Mark
This month-year
FORMAT( [Last Data Update], "mm/yyyy")
previous month
FORMAT( DATEADD([Last Data Update],-1,Month), "mm/yyyy")

Calculate Works until i add FILTER

I'm learning DAX and I'm trying to make a measure for Sales Last year.
this formula works :
Sales LY = CALCULATE([Sales CY],SAMEPERIODLASTYEAR(Date[Date]))
But when I add FILTER to the measure, it gives me the values from the current year like "Sales CY"
Sales LY = `CALCULATE([Sales CY], Filter (dim_date, SAMEPERIODLASTYEAR (Date[Date]) ))`
I already have a date filter on the page relative date in this year
the invoices Table and Date table are joined on the date of the creation of the invoice (createdat)
Any ideas what's the meaning behind the things in blue circles?
The FILTER function expects a condition that can be checked for each row of the table instead of a column of dates returned by SAMEPERIODLASTYEAR, so I wouldn't expect the second version to work.
I think the bits circled in blue are emphasizing that you are connected an imported data table to a DirectQuery table (different storage modes).

Why SAMEPERIODLASTYEAR function does not generate correct result

First I calculated Year to date written Premiu:
YTD WP = TOTALYTD([Ttl WP],dim_Date[Date]) //works fine
Then in order to calculate the same for previous year I'm using SAMEPERIODLASTYEAR function:
PY WP = CALCULATE([YTD WP],
SAMEPERIODLASTYEAR(dim_Date[Date]), ALL(dim_Date)
)
The result should be $72,550 M. Where does it get $127.60M???
So, unfortunately it does not give me correct result.
I have similar report already and function works fine, but why it doesn't work in this situation?
UPDATE 1:
Using DATESYTD to get numbers for previous year also gives me 127M
PY WP = CALCULATE([YTD WP],
DATEADD(DATESYTD(dim_Date[Date]),-1,YEAR)
)
UPDATE 2:
PY WP = CALCULATE(
[YTD WP], SAMEPERIODLASTYEAR(DATESYTD(dim_Date[Date])), ALL(dim_Date)
)
UPDATE 3:
Marked dim_Date table as "Date" table.
PY WP = TOTALYTD([Ttl WP], SAMEPERIODLASTYEAR(dim_Date[Date]))
But still gives incorrect number.
I used filter function to make sure what is the number should be:
PrevYear = CALCULATE([Ttl WP],FILTER(dim_Date,dim_Date[Date] >=VALUE("2018-01-01") && dim_Date[Date] <=VALUE("2018-03-31")))
And I got correct number.
You forgot to mark the dim_Date table as the Date Table. Without this, the Time Intelligence functions do not work correctly.
To do this, right click the dim_Date table, and choose Mark as Date Table from the context menu. You can then choose the Date column as the key. The following snippet is taken from Time Intelligence in Power Pivot documentation but it applies to all products compatible with DAX.
In order to work with time-intelligence functions, you need to have a date table included in your Data Model. The date table must include a column with one row for every day of each year included in your data. This column is considered to be the Date column (although it can be named whatever you like). Many time-intelligence functions require the date column in order to calculate according to the dates you select as fields in a report. For example, if you have a measure that calculates a closing quarter-end balance by using the CLOSINGBALANCEQTR function, in order for Power Pivot to know when the end of the quarter really is, it must reference the date column in the date table to know when the quarter starts and ends.
Once this is done, your calculations work fine - though your PY WP measure can be simplified to:
[PY WP] = TOTALYTD([Ttl WP], SAMEPERIODLASTYEAR(dim_Date[Date]))
For more information, see Set and use date tables in Power BI;

Power BI: Percent Change Formula

I want to create a simple percent change formula in power BI. Specifically, I want to evaluate month over month %change in cost. I know that percent change can be defined in different ways, so to be clear this is the formula that I am referring to:
%change = ([current value] - [previous value])/[previous value].
Here is an example in Excel of what I want to achieve:
I cannot find a way to target a specific row in a DAX formula. It seems that power BI only wants to include aggregate values such as sum, max, etc.
As a final note, I know that PowerBI includes a percent change "quick measure". However, the 'Base Value' always requires you to select aggregate measure instead of a single row value.
As Alexis mentioned, there is no concept of referring to a specific row in DAX. It can be a hard notion for people who are used to Excel, but if you want to take advantage of PowerBi, you will have to "unlearn" Excel way of thinking.
To accomplish your goal, you need to do some data modeling first. As a common practice, replace your "Date" column with a proper Calendar table:
Calendar table explained
As a result, you will have a data model in PowerBi that looks something like this:
Once you have such structure in place, DAX is simple:
Current Month Cost = SUM(Expenses[Cost])
Previous Month Cost = CALCULATE( [Current Month Cost], PREVIOUSMONTH(Calendar[Date]))
% Change = DIVIDE( [Current Month Cost] - [Previous Month Cost], [Previous Month Cost])
I used Earlier to get the previous date value for Open
Accum = var previousOpen=CALCULATE(MAX(EOG[Open]),FILTER(EOG,EOG[Date]<EARLIER('EOG'[Date],1))) return Divide(EOG[Open]-previousOpen,previousOpen)+1