DAX percentiles of sums - excel

I have a table with the following fields:
[Date]
[Ref Nr]
[Units]
I'd like to do a SUM over [Units] for each value in [Date] and [Ref Nr] and then take a 80 percentile for each value in [Ref Nr].
I've tried the following but it doesn't work...
DEFINE
MEASURE 'Table'[Pctl] =
CALCULATE(
PERCENTILEX.INC(
'Table',
CALCULATE(
SUM('Table'[Units]),
ALLEXCEPT('Table',
'Table'[Date],
'Table'[Ref Nr]
)
),
0.8
),
ALLEXCEPT('Table',
'Table'[Ref Nr]
)
)
EVALUATE
FILTER(
SUMMARIZE(
'Table',
'Table'[Ref Nr],
"Percentile 80",
'Table'[Pctl]
),
'Table'[Pctl] <> 0
)
Could you please guide me how to make it work?
Thanks in advance :)

I think your Pct1 calculation should look as follows:
MEASURE 'Table'[Pctl] =
CALCULATE(
PERCENTILEX.INC(
VALUES('Table'[Date],
CALCULATE(SUM('Table'[Units])),
0.8
)
)
as it will be evaluated in the context of [Ref Nr] in the final query, VALUES('Table'[Date]) will only return dates for the current [Ref Nr], the rest of the calculation should be clear I think

Related

DAX : Find process time & last operation from date/time difference

Need your help to find "Process Time" in hours and where it in last operation based on Max Operation number
DATEDIFF(
CALCULATE(
SUM(tableX[date/time]),
ALLEXCEPT(tableX,tableX[Operation],tableX[ID]),
tableX[date/time] <= EARLIER(tableX[date/time])
),
tableX[date/time],HOUR
)
I think you are looking for the following calculated column:
Process Time (Hours) = DATEDIFF(
CALCULATE(
MAX('tableX'[Date/Time]),
ALLEXCEPT(tableX,'tableX'[ID]),
'tableX'[date/time] < EARLIER('tableX'[date/time])
),
'tableX'[Date/Time],HOUR
)
This expression calculates the elapsed time sinds the previous step in the operation. If you want to calculate the elapsed time sinds the start of the operation, then simply change MAX('tableX'[Date/Time]) to MIN('tableX'[Date/Time]). Like this:
To create the last column, you can use this:
Last Operation =
IF (
'tableX'[Date/Time]
= CALCULATE ( MAX ( 'tableX'[Date/Time] ), ALLEXCEPT ( 'tableX', tableX[ID] ) ),
"Y",
"N"
)

Am getting operand clash error when running a datawarehouse compatible script

Hi I am getting an error like this: Operand type clash: date is incompatible with int.
Below is my query which I am running on a SQL Server:
CREATE TABLE val.census_last_month
WITH(
DISTRIBUTION = ROUND_ROBIN
, CLUSTERED COLUMNSTORE INDEX
)
AS
SELECT
dt_mydate AS dt_census,
(SELECT count(DISTINCT encounter_id)
FROM prod.encounter
WHERE encounter_type = 'Inpatient' AND (ts_admit BETWEEN dt_mydate - 30 AND dt_mydate) AND
(ts_discharge IS NULL OR ts_discharge > dt_mydate)) AS census,
(SELECT count(DISTINCT encounter_id)
FROM prod.encounter
WHERE encounter_type = 'Inpatient' AND cast(ts_admit AS DATE) = dt_mydate) AS admits,
(SELECT count(DISTINCT encounter_id)
FROM prod.encounter
WHERE encounter_type = 'Inpatient' AND cast(ts_discharge AS DATE) = dt_mydate) AS discharges
FROM ref.calendar_day
WHERE ref.calendar_day.dt_mydate BETWEEN (cast(getdate() as date) - 30) AND cast(getdate() as date);
You need to use dateadd function. See details here. https://learn.microsoft.com/en-us/sql/t-sql/functions/dateadd-transact-sql?view=sql-server-2017
There are multiple issues with this script, however can you confirm the datatypes starting "ts_" are dates stored as integers in the format yyyyMMdd and datatypes starting "dt_" are DATE?
Based on these assumptions, this is my attempted rewrite:
SELECT dt_mydate AS dt_census,
(
SELECT COUNT( DISTINCT encounter_id )
FROM prod.encounter
WHERE encounter_type = 'Inpatient' AND ( CAST( CAST( ts_admit AS CHAR(8) ) AS DATE ) BETWEEN DATEADD( day, -30, dt_mydate ) AND dt_mydate )
AND ( ts_discharge IS NULL OR CAST( CAST( ts_discharge AS CHAR(8) ) AS DATE ) > dt_mydate)
) AS census,
(
SELECT COUNT( DISTINCT encounter_id )
FROM prod.encounter
WHERE encounter_type = 'Inpatient' AND CAST( CAST( ts_admit AS CHAR(8) ) AS DATE ) = dt_mydate
) AS admits,
(
SELECT COUNT( DISTINCT encounter_id )
FROM prod.encounter
WHERE encounter_type = 'Inpatient'
AND CAST( CAST( ts_discharge AS CHAR(8) ) AS DATE ) = dt_mydate
) AS discharges
FROM ref.calendar_day
WHERE ref.calendar_day.dt_mydate BETWEEN CAST ( DATEADD( day, -30, GETDATE() ) AS DATE ) AND CAST( GETDATE() AS DATE );
If either of my assumptions are incorrect, please let me know and I will update the script.

Running total of a measure DAX

I am trying to calculate running total of a measure that I have created, I can get the pivot table to show it using "show Value As" however I cannot achieve the same using a new Measure and I need a new measure so I can then calculate year to date average
using the following formula I get sum of individual rows rather sum of aggregated rows per month
Any help would be appreciated
Thanks
Measure2:=CALCULATE(SUMX(Table,[measure1]),FILTER (
ALL( Calendar[Date]),
Calendar[Date] <= MAX (Calendar[Date] )
)
)
Measure1:=if(sum(AMOUNT)=0,Blank(),if(sum(AMOUNT)<0,[WAT],if([Countback]=1,(SUM(AMOUNT)/[CumulativSales1])*[Sum of Days],
if([Countback]=2,[Sum of Days]+((SUM(AMOUNT))-[CumulativSales1])/([CumulativSales2]-[CumulativSales1])*[Days Previous],
if([Countback]=3,[Sum of Days]+[Days Previous]+((SUM(AMOUNT))-[CumulativSales2])/([CumulativSales3]-[CumulativSales2])*[Days Previous2],
if([Countback]=4,[Sum of Days]+[Days Previous]+[Days Previous2]+((SUM(AMOUNT))-[CumulativSales3])/([CumulativSales4]-[CumulativSales3])*[Days Previous3],
if([Countback]=5,[Sum of Days]+[Days Previous]+[Days Previous2]+[Days Previous3]+((SUM(AMOUNT))-[CumulativSales4])/([CumulativSales5]-[CumulativSales4])*[Days Previous4],200)))))))
AverageSaleWeight2:=if(HASONEVALUE(Calendar[Date]),
CALCULATE(sum(INVOICE[Days Given * Amount])/sum(INVOICE[Amount GBP]),
DATEADD(Calendar[Date],-2,MONTH)),BLANK())
AverageSaleWeight3:=if(HASONEVALUE(Calendar[Date]),
CALCULATE(sum(INVOICE[Days Given * Amount])/sum(INVOICE[Amount GBP]),
DATEADD(Calendar[Date],-3,MONTH)),BLANK())
.....
Countback:=IF((DIVIDE([CumulativSales1],sum(Aging[OPEN_DOM_AMOUNT]))>=0.9999,1,
IF((DIVIDE([CumulativSales2],SUM(Aging[OPEN_DOM_AMOUNT]))>=0.9999,2,
IF((DIVIDE([CumulativSales3],SUM(Aging[OPEN_DOM_AMOUNT]))>=0.9999,3,
IF((DIVIDE([CumulativSales4],sum(Aging[OPEN_DOM_AMOUNT]))>=0.9999,4,
IF((DIVIDE([CumulativSales5],sum(Aging[OPEN_DOM_AMOUNT]))>=0.9999,5,6))))))))))
CumulativSales1:=CALCULATE(SUM(INVOICE[Amount GBP]),
DATESINPERIOD(Calendar[Date],
LASTDATE(Calendar[Date]),-1,MONTH))
CumulativSales2:=CALCULATE(SUM(INVOICE[Amount GBP]),
DATESINPERIOD(Calendar[Date],
LASTDATE(Calendar[Date]),-2,MONTH))
WAT:=if(sum([AMOUNT])=0,Blank(),IF([Countback]=1,[AverageSaleWeight],IF([Countback]=2,[AverageSaleWeight1],IF([Countback]=3,[AverageSaleWeight2],IF([Countback]=4,[AverageSaleWeight3],IF([Countback]=5,
[AverageSaleWeight4],IF([Countback]=6,[AverageSaleWeight5],30)))))))
Days Previous:=CALCULATE(SUM(Calendar[Days]),
DATESINPERIOD(Calendar[Date],
LASTDATE(Calendar[Date]),-2,MONTH))-CALCULATE(SUM(Calendar[Days]),
DATESINPERIOD(Calendar[Date],
LASTDATE(Calendar[Date]),-1,MONTH))
Days Previous2:=CALCULATE(SUM(Calendar[Days]),
DATESINPERIOD(Calendar[Date],
LASTDATE(Calendar[Date]),-3,MONTH))-CALCULATE(SUM(Calendar[Days]),
DATESINPERIOD(Calendar[Date],
LASTDATE(Calendar[Date]),-2,MONTH))
....
`
Try this revised version and see if you get the desired result:
Measure3 := CALCULATE(
SUMX( VALUES(Calendar[Month]), [measure1] )
, FILTER(
ALL(Calendar)
, Calendar[Date] <= MAX(Calendar[Date])
&& Calendar[Year] = MAX(Calendar[Year])
)
)
Latest Edit: added SUMX VALUES

PowerPivot Filter Function

In PowerPivot Excel 2016 I write a formula to summarize year to date sales using filter function as below:
SalesYTD:=CALCULATE (
[Net Sales],
FILTER (
ALL ( Sales),
'sales'[Year] = MAX ( 'Sales'[Year] )
&& 'Sales'[Date] <= MAX ( 'Sales'[Date] )
)
)
And it's work perfectly, now in my data I have a field called "Channel" which I want to filter it in my pivot table but it won't works!
Does anybody knows how should I fix this formula?!
Thanks in advance...
Try:
SalesYTD:=CALCULATE (
[Net Sales],
FILTER (
ALLEXCEPT ( 'Sales', 'Sales'[Channel] ),
'sales'[Year] = MAX ( 'Sales'[Year] )
&& 'Sales'[Date] <= MAX ( 'Sales'[Date] )
)
)
ALLEXCEPT removes all context filters in the table except filters that have been applied to the specified columns, in this case [Channel] column.
Let me know if this helps.

Identify first occurence of event based on multiple criterias

I have a dataset in PowerPivot and need to find a way to flag ONLY the first occurrence of a customer sub event
Context: Each event (COLUMN A) can have X number of sub events (COLUMN B),
I already have a flag that identifies a customer event based on multiple criteria's (COLUMN D)... What I need is a way to flag only the first occurrence of a customer sub event within each event, I've added a fake COLUMN E to illustrate how the flagging should work.
UPDATE
Additional situation - Having duplicated customer sub_events but only need to flag the first sub_event... should look like this:
Create a calculated column in your model using the following expression:
=
IF (
[Customer_Event] = 1
&& [Sub_Event]
= CALCULATE (
FIRSTNONBLANK ( 'Table'[Sub_Event], 0 ),
FILTER (
'Table',
'Table'[Event] = EARLIER ( 'Table'[Event] )
&& [Customer_Event] = 1
)
),
1,
0
)
If Sub_Event column is a number replace FIRSTNONBLANK ( 'Table'[Sub_Event], 0 ) by MIN('Table'[Sub_Event])
Also if your machine regional settings use ; (semicolon) as list separator replace every , (comma) in my expression by a semicolon in order to match your settings.
UPDATE: Repeated values in Sub_Event column.
I think we can use CaseRow# column to get the first occurence of Sub_Event value:
=
IF (
[Customer_Event] = 1
&& [Sub_Event]
= CALCULATE (
FIRSTNONBLANK ( 'Table'[Sub_Event], 0 ),
FILTER (
'Table',
'Table'[Event] = EARLIER ( 'Table'[Event] )
&& [Customer_Event] = 1
)
)
&& [CaseRow#]
= CALCULATE (
MIN ( 'Table'[CaseRow#] ),
FILTER (
'Table',
'Table'[Event] = EARLIER ( 'Table'[Event] )
&& [Customer_Event] = 1
)
),
1,
0
)
It is not tested but should work.
Let me know if this helps.

Resources