var filter calculatetable 几个函数的搭配

数据源:
file

进入daxstudio
file

DEFINE
MEASURE '表1'[qiu] = CALCULATE(SUM('表1'[数量]))
var tab =ADDCOLUMNS(VALUES('表1'[产品]),"求和",SUM('表1'[数量]))
var v= VALUES('表1'[产品])
var tabe = '表1'

运行第一个

EVALUATE
v

结果,没有筛选所以是全部产品
file
运行第二个

EVALUATE
tab

没有筛选求的是总计
file
运行第三个

EVALUATE
tabe

原表生成的变量
file
运行第四个

EVALUATE
'表1'

直接物理表
file
真是枯燥无味....


运行第五个

EVALUATE
CALCULATETABLE('表1','表1'[产品]="A")

对原表添加一个筛选
file
运行第六个

EVALUATE 
CALCULATETABLE(tabe,'表1'[产品]="A")

对变量添加一个筛选器
file
结果分析:变量不可以被筛选.
运行第七个

EVALUATE
ADDCOLUMNS(tabe,"产品数量1",[qiu])

给变量表添加一个度量值
file
变量会接受行上下文转换为筛选上下文,沿袭模型传递
运行第八个

EVALUATE
ADDCOLUMNS(v,"产品数量",CALCULATE(sum('表1'[数量])))

file
对上一个总结的验证
运行第九个

EVALUATE
CALCULATETABLE(ADDCOLUMNS(v,"求和",SUM('表1'[数量])),'表1'[产品]="A")

file
变量表不会接受外部筛选,
运行第十个

EVALUATE
{CALCULATE([qiu],v)}

file
变量可以作为筛选参数,但是不可以被筛选.
运行第11个

EVALUATE
FILTER(v,'表1'[产品]="A")

file
变量表可以迭代,但是不可以被筛选
补充:

EVALUATE
var a=FILTER('销售',[产品]="A")
RETURN ADDCOLUMNS(VALUES('销售'[产品]),"t",SUMX(KEEPFILTERS(a),CALCULATE(SUM('销售'[数量]))))

EVALUATE
var a=FILTER('销售',[产品]="A")
RETURN ADDCOLUMNS(VALUES('销售'[产品]),"t",CALCULATE(SUM('销售'[数量]),KEEPFILTERS(a)))

a为变量,第一个表达式a作为迭代函数的顶级参数,添加一个keepfilter可以接受外部筛选,同样作为calculate筛选参数同样接受了筛选
结果如下
file
再看下图

EVALUATE
'销售'
EVALUATE
var a=FILTER('销售',[产品]="A")
RETURN ADDCOLUMNS(VALUES('销售'[产品]),"t",CALCULATE(SUM('销售'[数量]),a))
EVALUATE
var a=FILTER('销售',[产品]="A")
RETURN ADDCOLUMNS(VALUES('销售'[产品]),"t",CALCULATE(SUM('销售'[数量]),KEEPFILTERS(a)))
EVALUATE
'销售'
EVALUATE
var a ='销售'
RETURN ADDCOLUMNS(VALUES('销售'[产品]),"t",CALCULATE(SUM('销售'[数量]),a))
EVALUATE
var a ='销售'
RETURN ADDCOLUMNS(VALUES('销售'[产品]),"t",CALCULATE(SUM('销售'[数量]),KEEPFILTERS(a)))
EVALUATE
'销售'
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"t",CALCULATE(SUM('销售'[数量]),'销售'))
EVALUATE
ADDCOLUMNS(VALUES('销售'[产品]),"t",CALCULATE(SUM('销售'[数量]),KEEPFILTERS('销售')))

file
file
file
再看

EVALUATE
'销售'
EVALUATE
var a= '销售' 
RETURN
ADDCOLUMNS(VALUES('产品'[产品]),"t", CALCULATE(sum('销售'[数量]),a))
EVALUATE
var a= '销售' 
RETURN
ADDCOLUMNS(VALUES('产品'[产品]),"t", CALCULATE(sum('销售'[数量]),KEEPFILTERS(a)))
EVALUATE
ADDCOLUMNS(VALUES('产品'[产品]),"t",var a= '销售' RETURN CALCULATE(sum('销售'[数量]),a))
EVALUATE
ADDCOLUMNS(VALUES('产品'[产品]),"t",var a= '销售' RETURN CALCULATE(sum('销售'[数量]),KEEPFILTERS(a)))

file
再看

EVALUATE
'销售'
EVALUATE
var a='销售'
return 
ADDCOLUMNS(VALUES('产品'[产品]),"t",SUMX(a,CALCULATE(SUM('销售'[数量]))))
EVALUATE
var a='销售'
return 
ADDCOLUMNS(VALUES('产品'[产品]),"t",SUMX(KEEPFILTERS(a),CALCULATE(SUM('销售'[数量]))))
EVALUATE
ADDCOLUMNS(VALUES('产品'[产品]),"t",SUMX('销售',CALCULATE(SUM('销售'[数量]))))
EVALUATE
ADDCOLUMNS(VALUES('产品'[产品]),"t",SUMX(KEEPFILTERS('销售'),CALCULATE(SUM('销售'[数量]))))

file
太有意思了!

枯燥无味


运行第12个

EVALUATE
CALCULATETABLE(all('表1'),'表1'[产品]="A")

file
all表不会接受外部筛选的
运行第13个

EVALUATE
FILTER(ALL('表1'),'表1'[产品]="A")

file
all表是个表,迭代不受影响,
运行第14个

EVALUATE
CALCULATETABLE(ADDCOLUMNS(VALUES('表1'[产品]),"求和",SUM('表1'[数量])),'表1'[产品]="A")

file
外部筛选器改变了内部表,VALUES('表1'[产品])部分可见,SUM('表1'[数量])对外部可见上下文计算,
运行第15个

EVALUATE
FILTER(ADDCOLUMNS(ALL('表1'[产品]),"求和",SUM('表1'[数量])),'表1'[产品]="A")

file
迭代产品="A",SUM('表1'[数量])外部没有筛选上下,计算总计,
运行第16个

EVALUATE
CALCULATETABLE(ADDCOLUMNS(ALL('表1'[产品]),"求和",SUM('表1'[数量])),'表1'[产品]="A")

file
sum('表1'[数量])外部有个筛选上下文,计算的是产品A数量,
对比下边两个
运行第17个

EVALUATE
FILTER(ADDCOLUMNS(VALUES('表1'[产品]),"求和",SUM('表1'[数量])),'表1'[产品]="A")

filter第一参数先计算,每行都是78,然后计算第二参数
file
运行第18个

EVALUATE
ADDCOLUMNS(VALUES('表1'[产品]),"求和",SUM('表1'[数量]))

file
运行第19个

EVALUATE
CALCULATETABLE(ADDCOLUMNS(VALUES('表1'[产品]),"求和",SUM('表1'[数量])),'表1'[产品]="A")

file

filter 第一参数先于其他参数计算,calculatetable的第一参数最后计算的,受外部筛选环境影响.
运行第20个

EVALUATE
CALCULATETABLE(ADDCOLUMNS(VALUES('表1'[产品]),"求和",[qiu]),'表1'[产品]="A")

外部筛选器,会对VALUES('表1'[产品])进行筛选,[qiu]会对行上下文进行转换,
file
结果不言而喻
运行第21个

EVALUATE
CALCULATETABLE(ADDCOLUMNS(ALL('表1'[产品]),"求和",[qiu]),'表1'[产品]="A")

外部环境不会对ALL('表1'[产品])产生筛选,但是ALL('表1'[产品])产生的行上下文会覆盖外部筛选器,故是原表
file
运行第22个

EVALUATE
CALCULATETABLE(ADDCOLUMNS(ALL('表1'[产品]),"求和",[qiu]),'表2'[产品]="A")

将筛选器换成表2产品,筛选器不会筛选ALL('表1'[产品]),对于[qiu]而言外部有二个筛选器,不会覆盖,故取交集,
file
运行第23个

EVALUATE
CALCULATETABLE(ADDCOLUMNS(VALUES('表1'[产品]),"求和",[qiu]),'表2'[产品]="A")

这回我像看看'表2'[产品]是否会对VALUES('表1'[产品])构成筛选?结果是肯定的,会发生交叉筛选,
file
运行第24个

EVALUATE
CALCULATETABLE(ADDCOLUMNS(VALUES('表2'[产品]),"求和",[qiu]),'表1'[产品]="A")

看看'表1'[产品]能否筛选维度表?结果是否定的,所以VALUES('表2'[产品])是全部的产品,[qiu]会接受二个筛选器,结果会是交集
file
通过24个度量值可以加深我们的理解,目前市场有许多文章,要不只谈理论,要不只讲案例,很少有人讲计算原理,学了1年仍然一头雾水
关于filter和calculatetable的计算区别可以参考
https://zhuanlan.zhihu.com/p/111177429
这篇文章写的比较好,