我有一张大型事件表,这些事件发生在车辆库存中,这会影响他们是在服务还是在服务中 . 我想根据此表中的事件创建一个能够在任何时间点计算各种库存中车辆数量的度量 .
此表从SQL数据库中提取到Excel 2016工作表中,我正在使用PowerPivot尝试提出DAX度量 .
以下是一些示例数据 event_list
:
vehicle_id event_date event event_sequence inventory
100 2018-01-01 purchase 1 in-service
101 2018-01-01 purchase 1 in-service
102 2018-02-04 purchase 1 in-service
100 2018-02-07 maintenance 2 out-of-service
101 2018-02-14 damage 2 out-of-service
101 2018-02-18 repaired 3 in-service
100 2018-03-15 repaired 3 in-service
102 2018-05-01 damage 2 out-of-service
103 2018-06-03 purchase 1 in-service
我希望能够在Excel中创建一个数据透视表(或使用CUBE函数等)来获取这样的输出表:
date in-service out-of-service
2018-02-04 3 0
2018-02-14 1 2
2018-03-15 3 0
2018-06-03 3 1
基本上,我希望能够根据任何日期计算库存 . 这个例子只有几个日期,但希望提供足够的图片 .
到目前为止,我基本上已经提出了这个问题,但它计算的车辆数量超出预期 - 我无法弄清楚如何只采用最新的event_sequence或event_date并使用它来计算库存 .
cumulative_vehicles_at_date:=CALCULATE(
COUNTA([vehicle_id]),
IF(IF(HASONEVALUE (event_list[event_date]), VALUES (event_list[event_date]))>=event_list[event_date],event_list[event_date])
)
我尝试使用MAX()和EARLIER()函数,但它们似乎不起作用 .
编辑:添加了PowerBI标签,因为我现在正在使用该软件尝试解决此问题 . 请参阅Alexis Olson的回答评论 .
2 回答
我想我找到了比以前更清洁的方法 .
让我们在
event_list
表上添加两列 . 一个在该日期计算车辆"in-service"
,在该日期计算车辆"out-of-service"
的一个 .您可以为
OutOfService
创建类似的计算列,也可以将总减去InService
计数 .现在,您只需将
event_date
放在矩阵可视行部分上,并将InService
和OutOfService
列添加到值部分(使用聚合选项的最大值或最小值而不是总和) .这是计算列
InService
背后的逻辑:我们首先创建一个
Summary
表,计算每辆车的最大event_sequence
值 . (我们过滤event_date
只考虑我们正在使用的当前日期 . )现在我们知道每辆车的最后一个
event_sequence
值是什么,我们使用它来将整个表格过滤到与这些车辆和序列值对应的行 . 过滤器逐行遍历表,并检查序列值是否与我们在Summary
表中计算的序列值相匹配 . 请注意,当我们将Summary
表过滤到我们当前使用的车辆时,我们只获得一行 . 我只是使用MAXX
来提取[MaxSeq]
值 . (这有点像使用LOOKUPVALUE
,但你不能在变量上使用它 . )现在我们已经将表格过滤到每辆车的最新事件,我们需要做的就是计算其中有多少是
"in-service"
. 我在这里使用SUMX
,其中1*(True/False)
强制布尔值返回1
或0
.这非常困难 . 我没有一个很好的答案,但这里有一些有用的东西 .
您将创建一个新的计算表,您可以在其中计算每个日期的每辆车的状态 . 从每辆车和每个日期的基本交叉连接开始:
然后添加计算列以查找该日期每辆车的最大序列号 .
现在,您可以使用另一个计算列查找每个车辆/序列对的库存值:
结果应如下所示:
完成此操作后,您可以使用此计算表创建矩阵 . 将
event_date
放在行上,将Inventory
放在列上 . 过滤掉可视化级别过滤器中的空白库存值,并将vehicle_id
放在值字段中,使用计数或非重复计数作为聚合方法(而不是默认总和) .它应该如下所示: