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

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

做了下述一些DAX,结果在“总计”行出了一些问题。
并附上结果图片:几个DAX公式计算的结果 。

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

客户, 销售额

您需要登录后才可以回帖 登录 | 立即注册

返回顶部