PowerBI业务分析技巧:价格匹配问题

您看看需不需要 2024-02-20 03:55:43

之前分享过PowerBI做各种业务分析的小案例,如果你还没有看过,可以抽空再回顾一下:

目标实际对比折扣计算问题费用分摊问题部门变动问题

最近又有星友问到关于价格匹配的问题,这里就再来补充一个。

仍然以两个日常我们会遇到的数据为例,一个是订单表,包含每个订单的基本信息,只有销售数量:

还有一个是价格表,

每个产品的价格并不是固定的,而是根据不同的区域和销售数量,价格是变动的,这种情况下,如何匹配每个订单的产品价格呢?

下面以计算列和度量值两种方式来看看如何实现价格匹配。

计算列

从价格表中查询价格信息,匹配到订单表中,你可能想到的是RELATED函数,或者LOOKUPVALUE,但是对于上面的情况,这两个函数都难以实现。不过没有关系,按基本的业务逻辑,用常规的CALCULATE+FILTER函数就可以做到。

以上两个表不用建立关系,只需在订单表中用以下的表达式新建计算列:

单价 = VAR cp=[产品名称]VAR qy=[区域]VAR sl=[销售数量]RETURNCALCULATE( MAX('价格表'[单价]), FILTER( '价格表', '价格表'[产品名称]=cp&&'价格表'[区域]=qy&&'价格表'[区间最小值]<=sl&&'价格表'[区间最大值]>=sl ))

这个逻辑只用了最简单最常用的几个函数,如果你有不明白的地方,可以参考这篇文章:RELATED、LOOKUPVALUE报错?它才是最通用的函数

度量值

如果模型不做任何更改,还是上面两个表,度量值可以用类似的写法来实现价格匹配。

度量值写法如下:

单价度量值 = VAR cp=MAX('订单表'[产品名称])VAR qy=MAX('订单表'[区域])VAR sl=SUM('订单表'[销售数量])RETURNCALCULATE( MAX('价格表'[单价]), FILTER( '价格表', '价格表'[产品名称]=cp&&'价格表'[区域]=qy&&'价格表'[区间最小值]<=sl&&'价格表'[区间最大值]>=sl ))

这个度量值和上面计算列唯一的区别就是,在确定当前上下文时,度量值需要在列字段外面套个聚合函数,其他的写法完全相同,结果也是相同的,用表格展示如下:

不过在PowerBI中进行数据分析,无论是为了分析的可扩展性、DAX的简洁性、还是为计算性能考虑,最优的做法是建立数据模型,对于上面的两张表,其实都是提供数据的事实表,我们要先建立各种分析角度的维度表。

这里的分析维度有日期、区域和产品,所以先建立这三个维度表,关于维度表如何建,可以参考:Power BI建立维度表常用的几种方式

然后通过这三个维度表,与订单表和价格表建立关系,模型如下:

再写个基础度量值:

数量合计 = SUM('订单表'[销售数量])

通过这个模型,单价度量值可以写得更简洁:

单价度量值 = CALCULATE( MAX('价格表'[单价]), FILTER( '价格表', '价格表'[区间最小值]<=[数量合计]&&'价格表'[区间最大值]>=[数量合计] ))

这里就不需要单独写DAX函数来确定上下文了,因为上下文的字段会利用模型关系自动筛选价格表,找到当前产品在当前区域当前销量情况下的价格。

结果与前面的度量值完全一致,不过要记住,表格的上下文要使用维度表的字段。

价格匹配以后,其实我们的最终目标是要计算销售额,如果你直接写个度量值:

销售额=[数量合计]*[单价度量值]

对于每一笔订单,这样写没有问题:

但是合计会出问题,或者你用个卡片图展示总额的情况下,这个销售额是错误的,它会把整体的数量合计和单价简单相乘,逻辑上明显是不对的。

正确的逻辑应该是计算出每一笔订单的销售额,然后累加起来,才是整体的销售额。销售额应该这么写:

销售额 = SUMX( SUMMARIZE('订单表','日期表'[日期],'产品表'[产品名称],'区域表'[区域]), [数量合计]*[单价度量值])

这个写法我们之前也介绍过,就是解决总计问题的通用方案:

Power BI 总计错误的终极解决方案(二)

通过这个案例,不仅仅是学习如何进行价格匹配,其实任意场景下的多条件查询匹配问题,都可以参考这个做法。虽然计算列和度量值都可以做到,我建议用最后介绍的数据模型和度量值来实现。

PowerBI星球

0 阅读:0

您看看需不需要

简介:感谢大家的关注