如何在PowerBI中计算商品的动态单价及折扣?

在零售和电商数据分析中,动态计算商品单价及折扣是一项常见的需求。本篇文章将介绍如何在PowerBI中实现这一功能,包括数据模型设计、DAX表达式编写等。

问题描述

请自行建模计算销售的总金额与折扣价金额,计算规则如下:

1、订单表里只有数量,价格为动态价格,将根据日期动态调价,其中商品价格定义为最接近订单日期的最后一次调整的价格。

2、商品所属的大类与小类有不定期的折扣活动,检查某个订单的下单时间是否具有折扣,对于同一个大类或小类,若其有多个折扣,则取最近一个活动的折扣

3、如果大类小类均有折扣,以折扣力度大的为准,若无折扣,则不打折

4、关于折扣的计算,直接乘以对应折扣即可,比如折扣为62%,那么折扣价金额为:总金额×62%

具体问题如下图所示:

本案例的初始数据如下:

大类:

大类
儿童
家具

小类:

小类
玩具
文具
办公家具
普通家具

大类折扣:

大类折扣开始日期折扣结束日期折扣
儿童2021年1月11日2021年1月17日0.62
家具2021年3月4日2021年3月10日0.95
儿童2021年5月23日2021年5月24日0.7
家具2021年7月4日2021年7月9日0.84

小类折扣:

小类折扣开始日期折扣结束日期折扣
办公家具2021年1月18日2021年1月28日0.74
文具2021年4月2日2021年4月7日0.72
普通家具2021年4月21日2021年4月27日0.65
办公家具2021年4月22日2021年4月29日0.9
文具2021年4月29日2021年5月2日0.66
玩具2021年5月19日2021年5月25日0.62
普通家具2021年5月21日2021年5月29日0.92
文具2021年5月24日2021年5月25日0.91
办公家具2021年6月3日2021年6月6日0.74
普通家具2021年8月19日2021年8月26日0.89
办公家具2021年9月13日2021年9月16日0.89

商品类别:

大类小类商品
儿童玩具乐高
儿童玩具遥控车
儿童玩具小飞机
儿童文具
儿童文具
家具办公家具办公桌
家具办公家具椅子
家具普通家具柜子
家具普通家具
家具普通家具沙发

调价表:

商品价格生效日期
乐高10002021年1月1日
遥控车5002021年1月1日
小飞机3002021年1月1日
52021年1月1日
52021年1月1日
办公桌10002021年1月1日
椅子20002021年1月1日
柜子30002021年1月1日
50002021年1月1日
沙发80002021年1月1日
沙发84802021年1月29日
5.752021年1月31日
5.252021年3月5日
遥控车4802021年4月2日
52502021年5月28日
沙发72002021年6月23日
5.552021年7月15日
办公桌8802021年7月23日
小飞机2702021年8月22日
5.82021年9月3日

销售订单:

日期商品数量
2021年1月7日乐高47
2021年1月7日椅子23
2021年1月12日办公桌36
2021年1月22日28
2021年2月7日柜子37
2021年2月11日13
2021年2月12日小飞机27
2021年2月18日小飞机28
2021年3月10日办公桌37
2021年3月20日沙发28
2021年3月28日办公桌27
2021年3月29日28
2021年3月30日乐高31
2021年4月2日办公桌18
2021年4月2日柜子25
2021年4月3日小飞机28
2021年4月14日遥控车32
2021年4月19日办公桌12
2021年4月24日柜子8
2021年4月26日办公桌49
2021年4月29日办公桌42
2021年5月2日沙发31
2021年5月6日5
2021年5月10日柜子18
2021年5月11日17
2021年5月13日沙发32
2021年5月14日遥控车4
2021年5月16日椅子44
2021年5月19日28
2021年5月23日沙发28
2021年5月26日10
2021年6月7日20
2021年6月7日36
2021年6月15日乐高30
2021年6月16日椅子10
2021年6月18日小飞机43
2021年6月26日46
2021年6月26日5
2021年6月28日沙发35
2021年6月30日38
2021年7月1日乐高1
2021年7月2日小飞机25
2021年7月5日24
2021年7月6日24
2021年7月7日办公桌12
2021年7月15日22
2021年7月18日沙发21
2021年7月20日椅子39
2021年7月22日小飞机44
2021年7月27日小飞机12
2021年8月5日沙发17
2021年8月7日椅子40
2021年8月8日20
2021年8月12日28
2021年8月19日办公桌46
2021年8月21日遥控车22
2021年8月22日6
2021年8月28日柜子25
2021年8月28日办公桌18
2021年8月30日柜子50
2021年9月5日乐高47
2021年9月6日39
2021年9月7日沙发48
2021年9月12日椅子18
2021年9月18日沙发45

若需其它辅助表等,可自行创建并建模。

解题要点

本案例的计算逻辑应该还是比较直观的,但由于表的数量较多且模型设计的自由度较高,导致没有固定的套路或计算逻辑,因此这里给出一些可能有帮助的提示:

1、在设计模型时,可以结合扩展表原理的应用,尽量在计算时将商品及其所属的大类或小类的筛选传递到各个表,这样计算折扣或单价时只需要再添加一个日期的筛选即可。

2、获取折扣或单价时,可以先筛选出过去的数据,然后使用TOPN函数根据日期降序来获取最近的数据。

3、可以利用COALESCE函数或MIN函数来减少一些表达式的书写。

解决方案

首先设计数据模型,具体如下图所示:

然后,创建如下度量值:

总金额 = 
SUMX(
	'销售订单',
	CALCULATE(
		MAXX(TOPN(1,'调价表','调价表'[生效日期]),'调价表'[价格]),
		'调价表'[生效日期]<=EARLIER('销售订单'[日期])
	)*'销售订单'[数量]
)
折扣价金额 = 
SUMX(
	'销售订单',
    VAR CurDate = '销售订单'[日期]
    VAR Price = 
        CALCULATE(
		    MAXX(TOPN(1,'调价表','调价表'[生效日期]),'调价表'[价格]),
		    '调价表'[生效日期]<=CurDate
	    )
	VAR Category_rebate = 
        CALCULATE(
            MAXX(TOPN(1,'大类折扣','大类折扣'[折扣开始日期]),'大类折扣'[折扣]),
            '大类折扣'[折扣开始日期]<=CurDate && CurDate<='大类折扣'[折扣结束日期]
        )
	VAR SubCategory_rebate = 
        CALCULATE(
            MAXX(TOPN(1,'小类折扣','小类折扣'[折扣开始日期]),'小类折扣'[折扣]),
            '小类折扣'[折扣开始日期]<=CurDate && CurDate<='小类折扣'[折扣结束日期]
        )
    VAR Finally_rebate = MIN(COALESCE(Category_rebate,1),COALESCE(SubCategory_rebate,1))
    RETURN
    '销售订单'[数量]*Price*Finally_rebate
)

然后创建一个矩阵,并将大类和子类作为行标签,再将上面的度量值放入矩阵的值字段即可,结果如下图所示:

总结

以上方法仅供参考,若有更优雅的解决方案,欢迎留言讨论,或者加入我们的技术交流群,一起享受这种思维碰撞的快乐吧!

PBI/DAX技术交流群(QQ):344353627

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PowerBI | 夕枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值