如何在PowerBI中按阶梯单价计算金额?

阶梯定价(也称为分段定价或批量折扣定价)是一种常见的定价策略,即根据数量的不同区间应用不同的单价。本篇文章将介绍如何在PowerBI中实现这种复杂的阶梯单价金额计算。

问题描述

某工厂对员工完成的订单数量采取阶梯单价(类似个税),请自行建模计算各员工应得到的金额,并确保总计的汇总正确。具体问题如下图所示:

本案例的初始数据如下:

订单完成表:

员工编号完成订单数
11506
2801
31200
40
53248
6502
71462

区间单价表:

区间最小值最大值单价
1-80018000.1
801-120080112000.2
1201-1600120116000.3
1601-2000160120000.4
>=2001200199999999990.5

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

解题要点

方法一:

1、首先找出员工完成订单数所涉及到的各个区间,只要单价区间的最小值小于或等于完成订单数,那么这些区间就是涉及到的区间。

2、对涉及到的区间进行迭代求和,将各个区间所对应的数值与对应单价相乘,以得到金额。

方法二:

采用个税常用的算法,即先计算出各个区间对应的速算扣除数,然后直接定位完成订单数所处的最高区间,然后将完成订单数与单价相乘并减去速算扣除数即可。

速算扣除数的具体算法逻辑可参考下图:

解决方案

首先,本案例无需连接关系,具体的模型如下图所示:


方法一:

首先,创建如下度量值:

金额 = 
SUMX(
    '订单完成表',
    SUMX(
        '区间单价表',
        PRODUCTX(
            {
                MIN('区间单价表'[最大值],'订单完成表'[完成订单数])-'区间单价表'[最小值]+1,
                '订单完成表'[完成订单数]>='区间单价表'[最小值],
                '区间单价表'[单价]
            },
            [Value]
        )
    )
)

然后创建一个矩阵,并将订单完成表中的员工编号字段作为行标签,再将上面的度量值以及完成订单数字段一起放入矩阵的值字段即可,如下图所示:


方法二:

首先,在区间单价表中创建一个计算列,用于计算速算扣除数,如下图所示:

所用到的计算列表达式如下:

速算扣除数 = 
SUMX(
    '区间单价表',
    ('区间单价表'[最小值]<EARLIER('区间单价表'[最小值]))
        *(EARLIER('区间单价表'[单价])-'区间单价表'[单价])
            *('区间单价表'[最大值]-'区间单价表'[最小值]+1)
)

然后,创建如下度量值:

金额-速算版 = 
SUMX(
    VALUES('订单完成表'[员工编号]),
    VAR Num = CALCULATE(SUM('订单完成表'[完成订单数]))
    RETURN
    SUMX(
        FILTER('区间单价表','区间单价表'[最小值]<=Num && Num<='区间单价表'[最大值]),
        Num*'区间单价表'[单价]-'区间单价表'[速算扣除数]
    )+0
)

然后创建一个矩阵,并将订单完成表中的员工编号字段作为行标签,再将上面的度量值以及完成订单数字段一起放入矩阵的值字段即可,如下图所示:

总结

以上方法仅供参考,若有更优雅的解决方案,欢迎留言讨论~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

PowerBI | 夕枫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值