添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
SUM with Filter =
 
   CALCULATE( SUM('Global-Superstore'[Sales]),
             
 FILTER('Global-Superstore', 'Global-Superstore'[Category]="Furniture")

如下图右侧所示,右侧虽然没有任何分类字段,但是由于包含了筛选,因此聚合结果的结果,就等于furniture的聚合值。

SUM with Filter包含筛选的SUM

【喜乐君解】

「喜乐君」熟悉Excel的人更倾向于SUM+IF的方式(注意还不是SUMIF),如下所示。

SUM( IF 'Global-Superstore'[Category]="Furniture" 
     THEN 'Global-Superstore'[Sales]) 

这两种方式的本质差异是什么?为什么这里出现了Calculate,从聚合方式的角度看,它是函数还是服务聚合的表达式?Calculate和SUM+IF两种方式的差异是什么?沿着这几个问题,我们可以进一步理解筛选是如何深刻的影响聚合,并且理解筛选对于性能优化的重要性。

如下图所示,在SUM中嵌套IF的“筛选”是“真计算、伪筛选”,使用修改数据为0或者null,使其虽然参与了聚合计算,但是似乎没有参与计算一样,最终实现“间接筛选”;而FILTER方式则是“真筛选”,它减少了数据表的明细数量,所以在性能上表现更好。

SUM+IF和CALCULATE聚合表达式的区别

CALCULATE表达式的方式,可以粗略地对应Excel中的SUMIF函数,通过把IF和SUM紧紧整合在一起,让不满足条件的数据无需参与计算,而不需要返回0或者null。 只是SUMIF的逻辑常用于“固定条件”的聚合,而CALCULATE的逻辑具有了更高的灵活性,以至于FILTER可以来自于视图中的动态筛选、切片器,甚至其他。

当然,SQl中也有类似的逻辑,一种是SUM(if then end ),另一种是结合where子句。该主题的对比参考详见喜乐君文章: CALCULATE表达式(上):从SUM、SUM+IF到SUMIF、CALCULATE演进史 (2023-9).

SUM('Global-Superstore'[Sales]), FILTER ('Global-Superstore', AND ('Global-Superstore'[Category] = "Furniture", 'Global-Superstore'[Sub-Category]="Chairs")

Step-2: 把上述度量值拖入视图中,视图的分类字段是:类别、子类别。 注意,在没有任何维度的视图中(右侧所示),聚合值的结果就是同时满足category= ‘furniture’ 和 sub-category =‘chairs’对应的销售额的总和。

SUM('Global-Superstore'[Sales]), FILTER ('Global-Superstore', OR ('Global-Superstore'[Category] = "Furniture", 'Global-Superstore'[Sub-Category]="Chairs")

由于chair子类别只是furniture类别的子类,这里的OR相当于忽略了小范围的筛选器,获得了“furniture的销售额总和”。

SUM with OR function

【喜乐君备注】多个条件,这里相当于集合运算OR,两个子集取并集。

2013 Sales =SUMX 
    (FILTER ( 'Global-Superstore',
        Year('Global-Superstore'[Order Date]) = 2013 ),
    'Global-Superstore'[Sales] 

【喜乐君】2013年的销售额,相当于在聚合之前,增加年度的筛选条件。聚合的对象依然是sales字段,但是聚合的范围相比之前有所减少——从默认的整个table到指定的明细行。我们把这个结构不同、只是数量级上的变化称之为FIlter筛选。

SUMX with AND = SUMX(
    FILTER ('Global-Superstore', 
         AND ('Global-Superstore'[Category] = "Furniture", 
             'Global-Superstore'[Sub-Category]="Chairs")
     'Global-Superstore'[Sales]

2.4SUMX with OR function

同理,使用OR计算多个筛选条件的并集,然后再计算求和。

SUMX with OR = 
SUMX(
   FILTER ('Global-Superstore', 
       OR ('Global-Superstore'[Category] = "Furniture",
          'Global-Superstore'[Sub-Category]="Chairs")
  'Global-Superstore'[Sales]