好友
阅读权限10
听众
最后登录1970-1-1
|
45吾爱币
本帖最后由 supermhp 于 2024-6-30 12:32 编辑
近来学习了一下PowerBI,在对calculate公式的上下文转换,和SUMX相关的DAX公式有一些有难点困扰了我很久,想询问下各位PowerBI高手和Dax高手,背后结果为什么是这样的。
详细“问题1-问题5”,及“//附注:”在下方用绿色字体写明。若有幸能获得解答,非常感谢。若对其中任何一个单独问题有自己的理解,也可以单独在帖子馁回复讨论或私信我 微信号讨论。后续能若获得解答,我也会整理后发出,供大家参考,共勉。
剩的CB就这些啦。感谢!
1:背景情况:
(1)存在两张表:'客户'信息表,及'订单'表。
(2)表内信息简介:'客户'信息表是每行不重复的客户信息汇总表,不含任何销售额等销售信息;'订单'表是历史的订单信息,每一行信息包含 [销售额] 及订单的 [客户ID] 信息。
(3)双表关系:两张表通过'客户'[客户ID],进行一对多的模型联系。'客户'信息表中的[客户ID]列是唯一的。
(4)整体订单的销售合计为:16,117,548.24
2:5个DAX公式比较及问题:
公式目标:我目前想要筛选出历史累计销售额最高的8位客户,并显示其销售金额,已知最高8位客户销售合计为 :559,397.45。
做了下述一些DAX,结果在“总计”行出了一些问题。
并附上结果图片:几个DAX公式计算的结果 。

图片中的每一列结果已按下述公式顺序排列。
(1)客户 销售额 按TOPX sup simple =
sumx(FILTER('客户', RankX(all('客户'), calculate(SUM('订单'[销售额])),, DESC, Dense)<=8),
calculate(sum('订单'[销售额]),
FILTER('客户',
RankX(ALL('客户'),
sum('订单'[销售额]), , DESC, Dense)
<=8
)
)
)
总计行数字等于:128,940,385.90 = 16,117,548.24 * 8
问题1:总计问题:表格里客户ID的每行和总计的计算分别发生了什么,导致行筛选没问题,总计出现了8倍的错误。以及第二个calculate中的第二个参数filter中的sum('订单'[销售额]),我没有加calculate,为什么没有导致第1-8行的客户ID销售额分别都变成16,117,548.24?
(2)客户 销售额 按TOPX sup simple sum calculate test = //附注:该公式其实仅为公式(1)的sumx函数的第二部分参数,我一起截图出来,方便理解程序背后发生了什么。
calculate(sum('订单'[销售额]),
FILTER('客户',
RankX(all('客户'),
sum('订单'[销售额]), , DESC, Dense)
<=8
)
)
总计行数字等于: 16,117,548.24 (这个仅作参考,没啥问题)
问题2: 无
(3)客户 销售额 按TOPX sup simple, filter +calculate = //附注:这个公式较公式(1)把第二个filter中的sum函数加了个“calculate”(即第三个calculate,已标红)
sumx(FILTER('客户', RankX(all('客户'), calculate(SUM('订单'[销售额])),, DESC, Dense)<=8),
calculate(sum('订单'[销售额]),
FILTER('客户',
RankX(ALL('客户'),
CALCULATE(sum('订单'[销售额])), , DESC, Dense)
<=8
)
)
)
总计行数字等于:4,475,179.63 = 559,397.45 * 8
问题3:,这里我加了第三个calculate,但为什么总计的数字,在前8名客户的销售额合计基础上还是乘以了8?
(4)客户 销售额 按TOPX sup simple, del 2nd filter = //附注:这个公式删除了sumx函数中,第二个参数 以calculate包装的 filter函数(这个函数给出的结果是正确的)
sumx(FILTER('客户', RankX(all('客户'), calculate(SUM('订单'[销售额])),, DESC, Dense)<=8),
calculate(sum('订单'[销售额])) //附注:这里没有了filter
)
总计行数字等于:559,397.45
问题4:这个虽然结果是正确的,但想知道第二个calculate中怎么增加一个filter,可以和目前公式等效?
(5)客户 销售额 按TOPX sup simple, del 2nd calculate = //附注:这个公式较公式(4)删除了整个公式中第二个calculate(已标红),也是整体sumx函数的第二个函数
sumx(FILTER('客户', RankX(all('客户'), calculate(SUM('订单'[销售额])),, DESC, Dense)<=8),
sum('订单'[销售额])
)
总计行数字等于:128,940,385.90 = 16,117,548.24 * 8
问题5:为什么这里把sumx第二个参数中的calculate取消后,总计会变成和公式(1)一样的结果。
问题6:上述sumx函数中第一个参数用了filter,但产出的表是以'客户'表为基础的,不含任何数据。因此第二个参数无法直接使用列表达。
这里用了Calculate+sum的函数来写sumx的第二个参数。但我其实没有特别理解第二个参数以sum来写,并且要套一层Calculate的筛选逻辑,为何这样的函数可以达到想要的效果?还望高手帮忙说明。再次感谢!
|
|