敏捷学习|DAX实际应用场景(二):多日期维度
表姐(做报表的小姐姐)做项目的时候经常遇到这种情况,同一个销售订单数据,不同部门要求以不同的口径统计,比如销售部门期望用下单日期、仓管部用发货日期,合管部用合同激活日期作为统计日期。但是无论是SSAS中的表格模型还是Power BI里的模型,两个表之间只能允许唯一一个活动关系。微软官方描述如下图:
微软官方的建议是导入多个查找列的表副本,但是问题来了,这样不仅会造成数据的冗余和内存的浪费,而且增加工作量好不好
我们来看看如何使用DAX解决这个问题。
有什么数据
如下图,示例中有一个日期维度表(DimDate)和一个销售订单表(FactInternetSales),其中销售订单表中有三个日期列,分别代表订单日期、截止日期、发货日期。
需求是什么
期望只导入一个日期维度表,但是能够从三个不同业务日期字段统计销售金额或数量
动动小手
1、创建关系
分别将销售订单表中的三个日期字段拖拽入日期维度表中与DateKey关联,如下图:
2、创建度量值
我们可以看到其中有两条关系线是虚线,不用担心是非活动关系,我们会使用USERELATIONSHIP函数来落实他们的关系、在空表下面创建以下三个度量值:
(1) SalesAmountByOrderDates=SUM('FactInternetSales'[SalesAmount])
(2) SalesAmountByDueDates = CALCULATE('Measure'[SalesAmount],
USERELATIONSHIP(DimDate[DateKey],'FactInternetSales'[DueDateKey]))
(3) SalesAmountByShipDates = CALCULATE('Measure'[SalesAmount],
USERELATIONSHIP(DimDate[DateKey],'FactInternetSales'[ShipDateKey]))
3、可视化
拖入日期列和三个新建的度量值,我们就得到了不同业务日期口径下的销售金额,如下图:
总结
USERELATIONSHIP函数可以帮助我们实现两表的多关系对应,但是一定要注意关系列必须要在模型中建立联系,即使是非活动的关系。否则创建的度量值时会出现以下警告: