Using summarize and userelationship to generate a sum based on a condition - powerbi

Story:
I have two date columns in my fact table, one is for orderdate and the second is for orderdate/refund/cancelled date.
I created two relationships between the date table and the fact table.
Active: Date > OrderDate
Inactive: Date > OtherDate
I would like to sum the # of refunds per day using the inactive relationship.
What I tried:
Returns =
VAR summary =
SUMMARIZE (
FILTER ( Query1, Query1[kind] = "refund" ),
Query1[orderId],
"returns", MAX ( Query1[amount] )
)
RETURN
CALCULATE (
MAX ( Query1[amount] ),
USERELATIONSHIP ( Query1[OtherDate], DateTable[Date] ),
summary
)
For some reason, it's using the active date column. Any suggestion on how to fix the above formula?

I'm not sure I understand how you are intending to use the summary variable here, but note that USERELATIONSHIP doesn't affect it at all since it's already computed.
You might not need that variable at all. Try this:
Returns =
CALCULATE (
MAX ( Query1[amount] ),
USERELATIONSHIP ( Query1[OtherDate], DateTable[Date] ),
Query1[kind] = "refund"
)

Related

Count the number of occurrences after associated date of certain value in Power BI

I'm conducting an exercise around examining test results after tutoring has occurred. Essentially looking at the rates of "pass" post tutoring within the context of a given student. Where the ultimate outcome would be:
pass rate after tutoring = [count passes]/[count test date] WHERE test date > tutoring date.
For example:
Ideally, the final output of the measure would be = 1 (1/1)
Would anyone be able to point me in the direction of achieving this through a Power BI measure?
I've attempted the following to get the single oc with no luck:
Measure 3 = CALCULATE(COUNT(Table[Test Pass?]),FILTER(Table,Table[Test Date]>CALCULATE(Min(Table[Tutoring Date]),FILTER(Table,Table[Tutor (?)] <> BLANK ))))
Where I would then use the student column in a matrix with the measure to group pass rates post tutoring by student
I have used this simple flat table data model:
You can calculate this with a measure that needs to be evaluated with your Student column:
Pass Rate After Tutoring =
VAR _tutor_date =
CALCULATE (
MAX ( 'Table'[Tutoring Date] ),
ALLEXCEPT ( 'Table', 'Table'[Student] )
)
VAR _tests_post_tutor =
CALCULATE (
COUNTROWS ( 'Table' ),
ALLEXCEPT ( 'Table', 'Table'[Student] ),
'Table'[Test Date] > _tutor_date
)
VAR _successes =
CALCULATE (
COUNTROWS ( 'Table' ),
ALLEXCEPT ( 'Table', 'Table'[Student] ),
'Table'[Test Date] > _tutor_date,
'Table'[Test Pass]
)
RETURN
DIVIDE ( _successes, _tests_post_tutor )
But this assumes that students are only tutored for one specific test, and are tutored once.

DAX use slicer selection in calculate statement

I am trying to use a calculate statement with a measure to filter results of a table but I need the values to change if the user selects 1 date from a slicer. Below is the code I am using.
PCurrentDay = calculate(sum('Sheet0 (2)'[Toys_Count]),datediff('Sheet0 (2)'[SCAN_Date],'Sheet0 (2)'[SHIP_Date],DAY)=0)
This returns a value but it won't update if the user selects a specific scan date. Any ideas?
Can you replace the measure with following
Measure =
CALCULATE (
SUM ( 'Table'[val] ),
FILTER (
'Table',
DATEDIFF (
CALCULATE ( MAX ( 'Table'[scan] ) ),
CALCULATE ( MAX ( 'Table'[ship] ) ),
DAY
) = 0
)
)
CALCULATE inside DATEDIFF provides the correct context for the filter to work.

DAX alternative for IN function

I have a table in SSAS Tabular model having delivery date of vehicles.
There is a dimension table with Age values -
I need to write a DAX to show the count of delivery for each year.
In the PowerBI report which connects to the Tabular model, the user can select the Age (multiple) from the filter which is on Dim_Age. So if the user selects Age 1 it should show the count of 2019 deliveries for the year 2020.
Now the challenge is I am working on SSAS 2016 build version 13.0.5426.0. This version does not support "IN" function. I have tried below and this does not work.
VAR selecteyear =
IF ( HASONEVALUE ( Dim_Cal[year] ); VALUES ( Dim_cal[year] ) )
CALCULATE (
COUNT ( Delivery_Data[Vechile] );
( selectedyear - Delivery_Data[DeliveryYear] )
IN VALUES ( Dim_Age[Age] )
)
Please help to know the alternate solution.
In general, the CONTAINS function is the workaround in older versions that don't support IN.
Here's how you could use it in you situation:
AgedCount =
VAR selectyear =
IF ( HASONEVALUE ( Dim_Cal[year] ), VALUES ( Dim_Cal[year] ) )
RETURN
CALCULATE (
COUNT ( Delivery_Data[Vechile] ),
FILTER (
ALL ( Dim_Cal ),
CONTAINS ( Dim_Age, Dim_Age[Age], selectyear - Dim_Cal[year] )
)
)
This iterates through the whole Dim_Cal table and for each row, checks if selectyear - Dim_Cal[year] is one of the values selected from the Dim_Age[Age] filter.

Using TREATAS to get Measure from Another Table

I'm back with another issue. I have a sales table with transaction details on the products purchased. I also have a table with warehouse inventory information for each product. I'm trying to get the count of products purchased in a Table visualization with columns from the warehouse inventory table.
I tried both of the measures below, but they both return the total Count for each row rather than sliced by product. Any help would be greatly appreciated!
NumProductsfromSales1 = calculate([Count], treatas(values('Sales'[Product]), 'Inventory'[Product]))
NumProductsfromSales2 =
var lineage = treatas(values('Sales'[Product]), 'Inventory'[Product])
var tbl = calculatetable('Inventory Detail', KEEPFILTERS(lineage))
var result = calculate(sumx(tbl, [Count]))
return result
From this source, we see TREATAS works as follows.
[Filtered Measure] :=
CALCULATE (
<target_measure>,
TREATAS (
VALUES ( <lookup_granularity_column> ),
<target_granularity_column>
)
)
is equivalent to
[Filtered Measure] :=
CALCULATE (
<target_measure>,
INTERSECT (
ALL ( <target_granularity_column> ),
VALUES ( <lookup_granularity_column> )
)
)
The important part is the ALL function. That's why you're losing the filter context from the rows in the visual.
I'm not sure if this is the most efficient solution, but I think if you add Inventory as a filter table to your first attempt, it should maintain the filter context on that table from the row in the visual.
NumProductsfromSales1 =
CALCULATE (
[Count],
'Inventory',
TREATAS ( VALUES ( 'Sales'[Product] ), 'Inventory'[Product] )
)
Edit: Regarding your comment, try the following:
a =
VAR top5prod =
SELECTCOLUMNS (
TOPN (
5,
SUMMARIZE ( Sales, Sales[Product], "Count", [Product Count] ),
[Count]
),
"Product", Sales[Product]
)
RETURN
CALCULATE (
[Product Count],
FILTER ( 'Inventory', 'Inventory'[Product] IN top5prod )
)
Using FILTER isn't as efficient as TREATAS but see if it works.
It's very difficult to answer this sort of question without having anything reproducible to work with.

Power BI Measure past due order using dates in two different tables

Request: Calculate the number of Purchased Orders past due. Recalculate when filters applied.
Background: Have 3 tables:
Purchase_Orders containing order [Promise Date],
Received_Orders containing [Received Date],
PO_DIM containing unique Purchase Order Numbers.
Relation: **Purchase_Orders -1 PO_DIM 1- Received_Orders
Measure Sudo Code:
1. CountRows
2. Filter for rows where Purchase_Orders[Promised Date] is not Blank()
3. Filter for rows where Received_Orders[Received Date] is Blank()
4. Filter for rows where Purchase_Orders[Promised Date] < Today()
How would you solve?
I would roll the 3 Filter requirements into one FILTER function, using RELATED to test columns from other tables, something like:
Count PO Pastdue =
CALCULATE (
COUNTROWS ( 'PO_DIM' ),
FILTER (
'PO_DIM',
NOT ( ISBLANK ( RELATED ( Purchase_Orders[Promised Date] ) ) )
&& ISBLANK ( RELATED ( Received_Orders[Received Date] ) )
&& RELATED ( Purchase_Orders[Promised Date] ) < TODAY ()
)
)