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

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"
)

Related

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

DAX percentiles of sums

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

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.

subquery with date and max()

i have problems with this query. It shall return the max temperature of the day but it returns empty. what have i done wrong?
SELECT *
FROM tempdat
WHERE date( tdate ) = curdate( )
AND temperature = (
SELECT max( temperature )
FROM tempdat ) ;
Rather use:
SELECT
convert(datetime, convert(varchar(12), tdate )) AS DayOfTemp
,max(temperature) AS MaxTemp
FROM
tempdat
WHERE
convert(datetime, convert(varchar(12), tdate )) = convert(datetime, convert(varchar(12, curdate( ) ))
group by
convert(datetime, convert(varchar(12), tdate ))
Your subquery returns the overall maximum of the data - not of the day, you need something like:
select max(temperature) from tempdat group by tdate having tdate = curdate()

Resources