Parallel Period Explanation - dax

I am fairly new to parallel periods and there use in dax. I understand the basics of parallel periods but I am not familiar using them. I am attempting to understand some code used by my company if anyone wouldn't mind breaking this down for me I would greatly appreciate it.
I understand the range it is pulling between but fail to understand how the initial max calendar year = 2021 works in all this. Also, if you can help explain how dividing the first set of code by the second works. That would be a freakin life saver. The end result currently is it comes out to equal a percentage that is used currently.
IF(
MAX('Calendar'[Year]) = 2021,
CALCULATE( [Total Cash] , PARALLELPERIOD('Calendar'[PERIOD_ENDING] , -24 , MONTH ) )
,
CALCULATE( [Total Cash] , PARALLELPERIOD('Calendar'[PERIOD_ENDING] , -12 , MONTH ) ))
IF(
MAX('Calendar'[Year]) = 2021,
CALCULATE( [Total Cash] , PARALLELPERIOD('Calendar'[PERIOD_ENDING] , -2 , YEAR ) )
,
CALCULATE( [Total Cash] , PARALLELPERIOD('Calendar'[PERIOD_ENDING] , -1 , YEAR ) ))

Related

Microsoft Power BI - DAX Time Intelligence measure - change context to reflect proper % change; non-YTD measures

I have a Power BI visual as below. There are 3 matrices. I have a DateDimension (or) Calendar table called Dates2.
I use two measures, one a regular measure (called 'Count'), the other a parallel period comparison of the measure (called 'Count_PreviousYear'). I use SAMEPERIODLASTYEAR DAX function for the latter.
1)
Count = COUNTA(TableX[ColumnY])
--Measure with name 'Count'--
2)
Count_PreviousYear = CALCULATE
(
[Count],
SAMEPERIODLASTYEAR(Dates2[Date])
)
--Measure with name 'Count_PreviousYear'
--this measure uses Time Intelligence function - SAMEPERIODLASTYEAR--
Both 'Count' and 'Count_PreviousYear' (obviously) are not YTD (YearToDate) values.
A third measure for the percentage change across periods is computed as below:
3)
PercentageChange = IF(
ISBLANK([Count]) || ISBLANK([Count_PreviousYear]),
BLANK(),
(([Count] - [Count_PreviousYear])/[Count])
)
Kindly ignore the fact that a keyword used as a measure name;
I have used the name 'Count' only for clarity; in my actual report,
I have proper names
The % change measure works fine, but one issue:
For the period change from 2020 to 2021, i.e. in the third row of the last matrix (for the row value 2021), the total (i.e. the % change value) is not appropriate.
I need to replace -737.21% with - 23.98 %.
This is because , I need to compute the Total for 2020, only by adding the values for the months of January and February, i.e. 428 + 430 = 858. (not 5794, which is for all the 12 months).
Since 2021 has only two months - January and February, I don't want to compare two months of 2021, with all the 12 months of 2020. Rather, I want two months of 2021 to be compared with the corresponding 2 months of 2020.
Essentially I need {(692-858)/692} * 100 = -23.98%
Currently, I see {(692-5794)/692} * 100 = -737.21%
Can someone help me achieve this?
Count Previous Year =
IF (
HASONEVALUE ( Dates2[Month] ),
IF (
[Count] <> BLANK (),
CALCULATE ( [Count], SAMEPERIODLASTYEAR ( Dates2[Date] ) )
),
IF (
HASONEVALUE ( Dates2[Year] ),
CALCULATE (
[Count],
DATESBETWEEN (
Dates2[Date],
EDATE ( MIN ( Dates2[Date] ), -12 ),
EOMONTH ( MAX ( [FactTable[Date] ), -12 )
)
)
)
)
Count_PreviousYear = IF (
(HASONEVALUE(Dates2[Year]) = TRUE && HASONEVALUE(Dates2[MonthName]) = TRUE),
CALCULATE
(
[Count],
SAMEPERIODLASTYEAR(Dates2[Date])
),
IF (
(HASONEVALUE(Dates2[Year]) = TRUE && HASONEVALUE(Dates2[MonthName]) = FALSE),
CALCULATE (
[Count],
DATESBETWEEN (
Dates2[Date],
EDATE (MIN(Dates2[Date]), -12),
EOMONTH (MAX(SourceData[Date]), -12)
)
),
BLANK()
)
)
!Output obtained as desired]1

exclude specific time for duration calculation

I have this dataset and calculated Datediff1 using below calculated column. Issue is no execution take place between 12am to 5am but when i calculate duration it adds extra 5 hours which is not giving exact duration, Any help will be appreciated.
Datediff1 =
ABS(
DATEDIFF (
CALCULATE (
MIN ( OTC[End Date] ),
FILTER (
OTC,
OTC[Index] = EARLIER ( OTC[Index] )+1
)
),
OTC[End Date],
MINUTE
)
)

Power BI - Compare Measures over Period

I'm currently working on a PowerBI script, which gives me headaches. I introduced a measurement, which shows the amount of sales for every company in a corporation. Which basically looks like this.
MarketShare =
DIVIDE(
CALCULATE(
SUM('Monthly Reports'[Active Certificates])
),
CALCULATE(
SUM('Monthly Reports'[Active Certificates]),
ALL('Monthly Reports'[Institute])
)
)
The output of this is a beautiful matrix showing me the marketshare of every company compared to the total sales.
Now I should display in a matrix below, (or the same, even better) the change of market share for every company every month. Hence, July should display a blank cell since it has no data before. August should display in the first line +0,34 in September +0,3 ... etcetera for every entry in line one and continuing down.
I tried to implement a measure, which deducts always the values from the previous one, but I have not been successful so far.
Market Share Prev Period =
(
DIVIDE(
CALCULATE(
SUM('Monthly Reports'[Active Certificates])
),
CALCULATE(
SUM('Monthly Reports'[Active Certificates]),
ALL('Monthly Reports'[Institute])
)
)
)
-
(
DIVIDE(
CALCULATE(
SUM('Monthly Reports'[Active Certificates]),
DATEADD('Monthly Reports'[LoadDate], -1, MONTH)
),
CALCULATE(
SUM('Monthly Reports'[Active Certificates]),
DATEADD('Monthly Reports'[LoadDate], -1, MONTH),
ALL('Monthly Reports'[Institute])
)
)
)
I get weird results at the moment. If I choose to filter by date and add the entire date the following table is displayed, it shows the correct differences for the middle dates, however not for the final date:
When I filter by date hirarchy and months (like in the other table above) I get exactly the same results again.
Thanks,
Vincenz
In your calculation you use ALLEXCEPT.
ALLEXCEPT removes the filters from the expanded table specified in the first argument(remove from all column in this table), keeping only the filters in the columns specified in the following arguments. That means you keep context from your matrix (July from your header). conditions are mutually exclusive.
You want to do the opposite thing, remove the filter from your "date" column. Use ALL('TableName'[ColumnName])
Your first measure should looks like:
Simple =
DIVIDE(CALCULATE ( SUM ( 'Monthly Reports'[Sales] ) )
, CALCULATE (
SUM ( 'Monthly Reports'[Sales] ),
ALL ( 'Monthly Reports'[Company] )
))
I solved my calculation and found a workaround for the wrongly displayed date hierarchy.
Sometimes the answer to a question if you're not familiar with a programming language yet is simpler as one could expect.
Finished working code:
Market Share Prev Period =
IF(
CALCULATE(
SUM('Monthly Reports'[Sales]),
PREVIOUSMONTH('Monthly Reports'[SaleDate])
)
<> BLANK()
,
(
DIVIDE(
CALCULATE(
SUM('Monthly Reports'[Sales])
),
CALCULATE(
SUM('Monthly Reports'[Sales]),
ALL('Monthly Reports'[Company])
)
,
0
)
)
-
(
DIVIDE(
CALCULATE(
SUM('Monthly Reports'[Sales]),
PREVIOUSMONTH('Monthly Reports'[SaleDate])
),
CALCULATE(
SUM('Monthly Reports'[Sales]),
PREVIOUSMONTH('Monthly Reports'[SaleDate]),
ALL('Monthly Reports'[Company])
)
,
0
)
),
"-"
)
I figured out, that be using DateAdd(.., -1, Month) I only changed what was read, not in which column it goes. So I was always missing the most recent value, as off course it was not read by the -1 operation and I was missing the oldest report as there was none before off course.
Basically I found the function: PREVIOUSMONTH (too simple to be true).
Furthermore, I added an IF clause before to check if I'm at the first column. If so, I'm dashing the value.
My only problem, which was left in the end, was that when displaying the date hierarchy I only saw dashes in all the fields of the matrix. However, if I displayed the whole date I could see all correct values. My workaround was to format the date with "mmmm". This displayed the same. I hope I will not need the date in any further step, as I will need to come back to this again.
So my result looked exactly perfect.

DAX ALLEXCEPT ignores Filter Context?

Need a Quarter-To-Date measure when a fiscal calendar is being used. Thought the following would work:
QTD =
CALCULATE (
[Total Amount],
FILTER (
ALLEXCEPT ( 'Calendar', 'Calendar'[FiscalYear] ),
'Calendar'[FiscalQuarter] = MIN ( 'Calendar'[FiscalQuarter] )
&& 'Calendar'[Date] <= MAX ( 'Calendar'[Date] )
)
)
However, even though the ALLEXCEPT function is saying NOT to "reset" the [FiscalYear] column, the measure is being calculated without regard to the fiscal year of the pivot coordinates. So the formula only works for the first fiscal year.
Anybody have any idea why the formula doesn't work as I anticipated?
TIA
Found a relevant thread on powerbi.com (link here), and I kinda sorta understand.
It seems that when you use the FILTER function with a date table it automatically applies an ALL() and you lose the filter context.
For my QTD formula the following works correctly:
CALCULATE(
[Total Amount],
FILTER(
ALL( 'Calendar' ),
'Calendar'[FiscalYear] = MIN( 'Calendar'[FiscalYear] )
&& 'Calendar'[FiscalQuarter] = MIN( 'Calendar'[FiscalQuarter] )
&& 'Calendar'[Date] <= MAX( 'Calendar'[Date] )
)
)
Please reply if you know of a simpler formula. The fiscal quarter ends, btw, do NOT align with the calendar quarter ends.

DAX Year over Year

I have been trying to get this DAX expression to show me cumulative searches for last financial year. Here is an example of the information;
Fiscal Week Fiscal Year Searches Brand
1 14 1000 Example1
1 15 1200 Example1
2 14 1000 Example1
2 15 1200 Example2
My formula below is working a little, but when I apply an slicers to the data it breaks in PowerBI. i.e. if I slice by another field, like brand.
Cum. Searches PY =
IF (
HASONEVALUE ( 'data'[Fiscal Year] ),
CALCULATE (
SUM ( 'data'[Searches] ),
FILTER (
ALL( 'data' ),
'data'[Fiscal Year.] = VALUES ( 'data'[Fiscal Year] ) - 1
&& CONTAINS(
VALUES ( 'data'[Fiscal Week] ),
'data'[Fiscal Week],
'data'[Fiscal Week] )
)
),
BLANK ()
)
I'd appreciate any pointers to where I'm going wrong? Thanks in advance.
I think it can be simplified, I dont understand the need for the HASONEVALUE or CONTAINS functions. I would use something like the following for your measure:
Cum. Searches PY:= CALCULATE(
SUM( Table1[Searches] ),
FILTER(
ALL( Table1[Fiscal Year] ) ,
Table1[Fiscal Year] = MAX( Table1[Fiscal Year] ) - 1
)
)
With that sample data above, this will produce results of:
Example1 2000
Example2 (Blank)
If that's not your expected result, then explain exactly what you want.

Resources