var filter calculatetable 几个函数的搭配
数据源:
进入daxstudio
DEFINE
MEASURE '表1'[qiu] = CALCULATE(SUM('表1'[数量]))
var tab =ADDCOLUMNS(VALUES('表1'[产品]),"求和",SUM('表1'[数量]))
var v= VALUES('表1'[产品])
var tabe = '表1'
运行第一个
EVALUATE
v
结果,没有筛选所以是全部产品
运行第二个
EVALUATE
tab
没有筛选求的是总计
运行第三个
EVALUATE
tabe
原表生成的变量
运行第四个
EVALUATE
'表1'
直接物理表
真是枯燥无味....
运行第五个
EVALUATE
CALCULATETABLE('表1','表1'[产品]="A")
对原表添加一个筛选
运行第六个
EVALUATE
CALCULATETABLE(tabe,'表1'[产品]="A")
对变量添加一个筛选器
结果分析:变量不可以被筛选.
运行第七个
EVALUATE
ADDCOLUMNS(tabe,"产品数量1",[qiu])
给变量表添加一个度量值
变量会接受行上下文转换为筛选上下文,沿袭模型传递
运行第八个
EVALUATE
ADDCOLUMNS(v,"产品数量",CALCULATE(sum('表1'[数量])))
对上一个总结的验证
运行第九个
EVALUATE
CALCULATETABLE(ADDCOLUMNS(v,"求和",SUM('表1'[数量])),'表1'[产品]="A")
变量表不会接受外部筛选,
运行第十个
EVALUATE
{CALCULATE([qiu],v)}
变量可以作为筛选参数,但是不可以被筛选.
运行第11个
EVALUATE
FILTER(v,'表1'[产品]="A")
变量表可以迭代,但是不可以被筛选
补充:
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筛选参数同样接受了筛选
结果如下
再看下图
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('销售')))
再看
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)))
再看
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('销售'[数量]))))
太有意思了!
枯燥无味
运行第12个
EVALUATE
CALCULATETABLE(all('表1'),'表1'[产品]="A")
all表不会接受外部筛选的
运行第13个
EVALUATE
FILTER(ALL('表1'),'表1'[产品]="A")
all表是个表,迭代不受影响,
运行第14个
EVALUATE
CALCULATETABLE(ADDCOLUMNS(VALUES('表1'[产品]),"求和",SUM('表1'[数量])),'表1'[产品]="A")
外部筛选器改变了内部表,VALUES('表1'[产品])部分可见,SUM('表1'[数量])对外部可见上下文计算,
运行第15个
EVALUATE
FILTER(ADDCOLUMNS(ALL('表1'[产品]),"求和",SUM('表1'[数量])),'表1'[产品]="A")
迭代产品="A",SUM('表1'[数量])外部没有筛选上下,计算总计,
运行第16个
EVALUATE
CALCULATETABLE(ADDCOLUMNS(ALL('表1'[产品]),"求和",SUM('表1'[数量])),'表1'[产品]="A")
sum('表1'[数量])外部有个筛选上下文,计算的是产品A数量,
对比下边两个
运行第17个
EVALUATE
FILTER(ADDCOLUMNS(VALUES('表1'[产品]),"求和",SUM('表1'[数量])),'表1'[产品]="A")
filter第一参数先计算,每行都是78,然后计算第二参数
运行第18个
EVALUATE
ADDCOLUMNS(VALUES('表1'[产品]),"求和",SUM('表1'[数量]))
运行第19个
EVALUATE
CALCULATETABLE(ADDCOLUMNS(VALUES('表1'[产品]),"求和",SUM('表1'[数量])),'表1'[产品]="A")
filter 第一参数先于其他参数计算,calculatetable的第一参数最后计算的,受外部筛选环境影响.
运行第20个
EVALUATE
CALCULATETABLE(ADDCOLUMNS(VALUES('表1'[产品]),"求和",[qiu]),'表1'[产品]="A")
外部筛选器,会对VALUES('表1'[产品])进行筛选,[qiu]会对行上下文进行转换,
结果不言而喻
运行第21个
EVALUATE
CALCULATETABLE(ADDCOLUMNS(ALL('表1'[产品]),"求和",[qiu]),'表1'[产品]="A")
外部环境不会对ALL('表1'[产品])产生筛选,但是ALL('表1'[产品])产生的行上下文会覆盖外部筛选器,故是原表
运行第22个
EVALUATE
CALCULATETABLE(ADDCOLUMNS(ALL('表1'[产品]),"求和",[qiu]),'表2'[产品]="A")
将筛选器换成表2产品,筛选器不会筛选ALL('表1'[产品]),对于[qiu]而言外部有二个筛选器,不会覆盖,故取交集,
运行第23个
EVALUATE
CALCULATETABLE(ADDCOLUMNS(VALUES('表1'[产品]),"求和",[qiu]),'表2'[产品]="A")
这回我像看看'表2'[产品]是否会对VALUES('表1'[产品])构成筛选?结果是肯定的,会发生交叉筛选,
运行第24个
EVALUATE
CALCULATETABLE(ADDCOLUMNS(VALUES('表2'[产品]),"求和",[qiu]),'表1'[产品]="A")
看看'表1'[产品]能否筛选维度表?结果是否定的,所以VALUES('表2'[产品])是全部的产品,[qiu]会接受二个筛选器,结果会是交集
通过24个度量值可以加深我们的理解,目前市场有许多文章,要不只谈理论,要不只讲案例,很少有人讲计算原理,学了1年仍然一头雾水
关于filter和calculatetable的计算区别可以参考
https://zhuanlan.zhihu.com/p/111177429
这篇文章写的比较好,
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)