PowerBI_一分钟学会利用ALLEXCPET分组计算(以计算门店开业前3天销售金额为例)

在某些特殊场景,我们往往需要去计算一些特定的组别的聚合数据

今天,就以计算门店开业前3天的销售情况,来学习一下,利用计算列和DAX度量值,两种快捷计算此类问题的方案。

一:XMIND

二:示例数据

2.1 示例数据列说明

为了方便验证和更清晰的检查结果,数据源只用了三列,分别是3个门店,分别为A,B,C,日期列,以及一列模拟的营业额数据。

2.2 计算目标

目标就是利用DAX或者计算列,计算出,每一家门店实际产生销售的前三天的营业额之和

三:计算列方案

首先,我们用计算列方案来解决。

遇到此类问题,最快捷或者说最直接的方式就是通过计算列给我们的每行数据进行数据标注,再通过CALCULATE计算器的筛选器,去筛选我们想要的标签,再得到结果

下方的计算列方案,第一步就是通过MIN函数求得最小得日期,由于我们是计算每个门店单独得最小日期得销售之和,所以这里使用了ALLEXCEPT,去除门店列得筛选,总而得到了每一个门店得开业前三天得数据标签。

最后,通过CALCULATE函数,对符合我们要求的数据,进行求和,便得出我们的结果。

具体DAX代码如下:

复制代码
第一步,新增营业表的计算列

IsFirst3Days = 

VAR MinDate = CALCULATE(MIN('示例表'[日期]), ALLEXCEPT('示例表', '示例表'[门店]))

RETURN

IF(

    '示例表'[日期] >= MinDate && '示例表'[日期] <= MinDate + 2,

    "开业前三天门店日期",

    "其他"

)     

第二步,度量值计算营业额,利用第一步的标签来筛选并计算

 IsFirst3Days_营业额= 

    CALCULATE(SUM('示例表'[营业额]),

            '示例表'[IsFirst3Days]="开业前三天门店日期")

四:DAX方案

那么有没有更加方便,或者说一步解决问题的方案呢?

当然有,我们来看看纯DAX的解决思路。

首先,思路和计算列方案是一样的,我们也是利用标签的形式去筛选表,然后直接对符合条件的行进行求和,即可得到目标值

下方DAX中,首先利用FILTER函数,对示例表进行筛选,配合ALLEXCEPT函数,去除表筛选条件,最后直接用CALCULATE函数进行聚合。

有一点不一样的是,计算列方案时,我们用了IF去进行判断,DAX方案中,我们用了并列条件,即同时满足这两个条件的行我们保留,小知识点,在DAX中我们会使用 "&&" 去表达我们的 "且" 这个概念。

最后,我们可以看到,两种方案的结果是一样的。

复制代码
纯DAX方案:

TotalSalesFirst3Days = 

CALCULATE(

    SUM('示例表'[营业额]),

    FILTER(

        '示例表',

        '示例表'[日期] >= CALCULATE(MIN('示例表'[日期]), ALLEXCEPT('示例表', '示例表'[门店])) &&

        '示例表'[日期] <= CALCULATE(MIN('示例表'[日期]), ALLEXCEPT('示例表', '示例表'[门店])) + 2

    )

)

看到这里,有些朋友可能会问,为什么会在这里介绍两种方案,而不只介绍DAX呢,明明DAX一步就可以解决问题?

因为,即便计算组,会浪费内存,在大的数据集表中有相当大的性能限制,但是,在某些紧急情况(来不及构思DAX)或者某些特殊场景下,我们首先需要解决问题,我们是鼓励多一些的解决问题思路。

所以,在性能充足时,不必纠结解决方式,解决问题就好,性能优化的事情,我们放在后面解决也不迟。

五:关键DAX-ALLEXCEPT函数

5.1 语法

ALLEXCEPT(<table>, <column1>, <column2>, ...)

5.2 作用

ALLEXCEPT函数会返回一个表,该表删除了所有筛选器,除了那些应用于指定列的筛选器。这在需要对某些列进行聚合计算时非常有用,而不受其他列的筛选条件影响。

5.3 使用场景

计算占比 :例如,你想计算某个城市在省份中的销售占比,可以使用ALLEXCEPT函数保留省份的筛选条件,移除其他筛选条件。

复杂的聚合计算 :在进行复杂的聚合计算时,ALLEXCEPT可以帮助你控制哪些列的筛选条件被保留,哪些被移除,从而更灵活地进行数据分析。

5.4 其他类似函数

ALL:移除所有筛选器,返回整个表或列

复制代码
ALL('销售数据')

ALLSELECTED:移除所有筛选器,但保留用户在视觉对象中选择的筛选器

复制代码
ALLSELECTED('销售数据')

REMOVEFILTERS:移除指定列或表的筛选器。

复制代码
REMOVEFILTERS('销售数据'[省份])

KEEPFILTERS:保留现有筛选器,并在此基础上添加新的筛选器。

复制代码
CALCULATE([销售量], KEEPFILTERS('销售数据'[城市] = "成都"))

六:总结

实际业务中,这类根据特定分组,如小组,商品品类,具体门店等,进行统计的场景是很常见的,而今天讲到的ALLEXCEPT函数的灵活使用,恰恰可以帮助我们解决这类问题

这类问题,包含了日期,分组占比,分组排名等等一系列的场景,值得我们花时间去研究,后续如果有实际案例发生,我会做补充的案例说明。

ENJOY DAX