模型的筛选方向

模型筛选这个是非常基础的知识,要完全理解并非易事,今天我就给新手演示一下简单的
数据源:
file
打开
file
第一个表达式:

EVALUATE
ADDCOLUMNS(VALUES('产品'[产品]),"求和",CALCULATE(SUM('销售'[数量])))

file
分析:VALUES('产品'[产品])结果是{"A","B"},A结果是3 ,B的结果是2,发生了行上下文转换.
第二个表达式:

EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(SUM('销售'[数量])))

file
结果同上,
第三个表达式:

EVALUATE
ADDCOLUMNS(VALUES('日历'[月份号]),"求和",CALCULATE(SUM('销售'[数量])))

file
分析:
发生了行上下文转换,只有1月份有数量
总结,calculate的第一表达式来源于事实表,可以接受任何维度表的筛选,事实表的列很重要.

深入分析


EVALUATE
ADDCOLUMNS(VALUES('产品'[产品]),"求和",CALCULATE(COUNTROWS('产品')))
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(COUNTROWS('产品')))
EVALUATE
ADDCOLUMNS(VALUES('日历'[月份号]),"求和",CALCULATE(COUNTROWS('产品')))

这次我写了三个表达式,后面calculate的第一参数是个维度表,
file
我们方向销售表和日期表都不能到达产品表,因为筛选方向的限制,一端可以筛选多端,多端不能筛选一端,只有表内的维度可以筛选本表,
第一个表达式,基于本表的筛选,
file
结果正确
第二个表达式,维度是销售表,结果没有筛选,结果是总计2
file
第三个表达式,日期表的维度,虽然可以到达销售表,但是销售表到产品表不通,所以筛选失败
file
每个月份都是2


再深入的


EVALUATE
ADDCOLUMNS(VALUES('产品'[产品]),"求和",CALCULATE(SUM('销售'[数量]),'销售'))
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(SUM('销售'[数量]),'销售'))
EVALUATE
ADDCOLUMNS(VALUES('日历'[月份号]),"求和",CALCULATE(SUM('销售'[数量]),'销售'))

给calculate的添加第二参数,销售
file
全部计算了总计,为什么呢,因为销售是个扩展表,包含了所有的列,calculate的第二参数可以覆盖已存在的外部筛选器,等同于没有外部筛选器,每行计算的都是总计

EVALUATE
ADDCOLUMNS(VALUES('产品'[产品]),"求和",CALCULATE(COUNTROWS('产品'),'销售'))
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(COUNTROWS('产品'),'销售'))
EVALUATE
ADDCOLUMNS(VALUES('日历'[月份号]),"求和",CALCULATE(COUNTROWS('产品'),'销售'))

第一表达式,已经存在筛选,所以内部覆盖外部筛选器,第二和第三个,本来就没有发生行上下文转换,所以不存在覆盖一说,扩展表和外部不存在任何关系.


EVALUATE
ADDCOLUMNS(VALUES('产品'[产品]),"求和",CALCULATE(SUM('销售'[数量]),CALCULATETABLE('销售')))
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(SUM('销售'[数量]),CALCULATETABLE('销售')))
EVALUATE
ADDCOLUMNS(VALUES('日历'[月份号]),"求和",CALCULATE(SUM('销售'[数量]),CALCULATETABLE('销售')))

给销售套个calculatetable结果呢?

file
被筛选了,并不是维度表筛选了,而是维度表筛选了calculate的第二参数,第一参数计算了第二参数.

EVALUATE
ADDCOLUMNS(VALUES('产品'[产品]),"求和",CALCULATE(COUNTROWS('产品'),CALCULATETABLE('销售')))
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(COUNTROWS('产品'),CALCULATETABLE('销售')))
EVALUATE
ADDCOLUMNS(VALUES('日历'[月份号]),"求和",CALCULATE(COUNTROWS('产品'),CALCULATETABLE('销售')))

结果同上
file
扩展表的计算原理是:先筛选扩展表=>再用扩展表筛选产品表,计算产品数


EVALUATE
ADDCOLUMNS(VALUES('产品'[产品]),"求和",CALCULATE(CALCULATE(COUNTROWS('产品'),'销售')))
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(CALCULATE(COUNTROWS('产品'),'销售')))
EVALUATE
ADDCOLUMNS(VALUES('日历'[月份号]),"求和",CALCULATE(CALCULATE(COUNTROWS('产品'),'销售')))

用双calculate,用外层calculate创建一个筛选上下文,用这个筛选上下文计算内部的扩展表,用扩展表筛选产品表
file



EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(SUM('销售'[数量]),'销售'))

EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(SUM('销售'[数量]),FILTER('销售','销售'[产品]="A")))
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(SUM('销售'[数量]),KEEPFILTERS(FILTER('销售','销售'[产品]="A"))))

第一个表达式结果:
file
分析:销售表产品不能筛选一端,外部没有筛选上下文,只考虑扩展表

第二个表达式:
file
忽略了外部筛选器,只考虑filter的筛选结果,所以每行都一样
第三个表达式
在filter的表达式外面套了一个keepfilter ,他会保留外部筛选器,
file
filter的迭代出产品等于A的表,同时保持外部筛选,筛选器取交集,第一行有交集,第二行没有交集
继续
file

EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",SUMX('销售',CALCULATE(SUM('销售'[数量]))))
--{2,2,1,1,1}迭代7
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",SUMX(KEEPFILTERS('销售'),CALCULATE(SUM('销售'[数量]))))
--{2,2,1}第一行5
--{1,1}第二行2
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(SUM('销售'[数量]),'销售'))
--{1,1,1,1,1}迭代5
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(SUM('销售'[数量]),KEEPFILTERS('销售')))
//KEEPFILTERS无用
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(SUM('销售'[数量]),FILTER('销售','销售'[产品]="B")))
迭代2
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(SUM('销售'[数量]),FILTER(KEEPFILTERS('销售'),'销售'[产品]="B")))//KEEPFILTERS无用
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"求和",CALCULATE(SUM('销售'[数量]),KEEPFILTERS(FILTER('销售','销售'[产品]="B"))))
--第一行blandk()
--第二行2

好了今天就分享到这里