吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1147|回复: 0
收起左侧

[经验求助] PowerBI的DAX问题:有关Calculate和sumx的函数案例,对总计及行筛选的影响

[复制链接]
supermhp 发表于 2024-6-30 02:17
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的筛选逻辑,为何这样的函数可以达到想要的效果?还望高手帮忙说明。再次感谢!



发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-10-18 09:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表