dax 行上下文转换问题

数据源:为了教学目的,数据源设计的简简单单,
file
现在我新建度量值
第一个度量值:

销售 行数:=COUNTROWS('销售')

透视表效果如下:
file
完全正确
第二个度量值:

数量 的总和:=SUM('销售'[数量])

对销售数量统计
file
完全正确
第三个度量值:

销售表-列 的副本:=SUMX('销售','销售'[数量])

透视表效果图:
file
第一行,结果是4求的是产品A的总计,这是因为sumx外部有个产品筛选器,sumx第一参数是外部筛选上下文的子集,这个子集只有A产品,sumx第二参数是行上下文,取得是当前行的数量,sumx迭代每行,第二参数计算后的列表{1,2,1},结果是4
file
第二行原理相同,结果是3


补增
补1

销售表-表 度量值:=SUMX('销售',[数量 的总和])

销售部分可见,受到外部上下文影响,销售表是个扩充表,所以外部上下文在计算度量值可以忽略了,sumx迭代计算的列
第一行{2,2,2}结果是6
第二行{1,2}结果3
总计{2,2,2,1,2}结果是9
file
补2

销售表-表sum:=SUMX('销售',SUM('销售'[数量]))

销售表部分可见,受到外部上下文影响,SUM('销售'[数量]计算外部筛选上下文,产品子集,
第一行{4,4,4}结果12
第二行{3,3}结果6
总计{7,7,7,7,7}结果35
file


第四个度量值:

销售表-列:=SUMX(FILTER('销售','销售'[产品]="A"),'销售'[数量])

这个度量值和第三个基本相同,就是对第一参数这个子集,添加了一个新的条件,第一行外部筛选器是A,结果是A的子集,FILTER('销售','销售'[产品]="A")结果全是,结果是4,第二行,因为外部产品是B,筛选上下文是产品B的子集,filter再在这个子集中找A产品,找不到,所以返回一张空表,所以sumx结果为空
file
第五个度量值:

销售表-度量值:=SUMX(FILTER('销售','销售'[产品]="A"),[数量 的总和])

这个度量值和第四个基本相同,就是sumx第二参数是个度量值,我们知道第一行sumx第一参数是个真子集,有3行,然后度量值会将当前行转换为筛选上下文,第一行度量值计算结果是2因为产品=A且数量=1有二行,结果是2,第二行产品=A且数量=2只有1行,结果2,第三行和第一行一样,结果是2,这个列表是{2,2,2},sumx集合是6,第二行外部筛选上下文产品B的子集,所以sumx第一参数为空,结果为空.
file
分析完全正确.
第六个度量值:

销售表-sum:=SUMX(FILTER('销售','销售'[产品]="A"),SUM('销售'[数量]))

sumx第一参数第一行是真,第二行是假,第二参数没有和第一参数行上下文发生下文转,那么SUM('销售'[数量]计算的是外部产品筛选上下文,第一行产品A的子集3行 数量之和是4,因为FILTER('销售','销售'[产品]="A")结果是3行的表,4迭代3次结果是12,第二行计算结果是3,因为迭代的表为空,所以结果为空.
file
file
第六个度量值:

产品-度量值:=SUMX(FILTER('产品','产品'[产品]="A"),[数量 的总和])

sumx第一参数是产品表,外部筛选上下文无法影响产品表,多端维度无法筛选一端表,FILTER('产品','产品'[产品]="A")是单独计算的,结果只有一行的表,因为没有维度重叠,所以外部筛选器和内部上下文取交集,透视表第一行为真,第二行为假,第一行4,第二行为空,产品B和产品A没有交集
file
第七个度量值:

产品-sum:=SUMX(FILTER('产品','产品'[产品]="A"),SUM('销售'[数量]))

SUM('销售'[数量])和sumx第一参数没有发生行上下文转换,所以它计算的是外筛上下文的子集,第一行是4,sumx第二参数迭代第一参数(1行的表),结果4,第二行SUM('销售'[数量])计算了产品B的子集,结果是3,迭代了sumx第一参数,1行的表,结果是3
file


让我新增all系列
第8个度量值:

销售表-表all-度量值:=SUMX(ALL('销售'),[数量 的总和])

ALL('销售')这个表不会受到外部上下器的影响,作为sumx第一参数,ALL('销售')代表整个的销售表包含重复值(all(表)不会删除重复),度量值处于行中,计算环境是外部产品筛选上下文和内部行上下文(度量值会转换的),内部筛选器替换了外部筛选器,只考虑内部筛选上下文,
第一行产品=A且数量=1,找到二行,结果2,
第二行产品=A且数量=2,只有1行结果2
第三行产品=A且数量=1,找到二行,结果2
第四行产品=B且数量=1,找到一行,结果1
第五行产品=B且数量=2,找到一行,结果2
sumx求和列表{2,2,2,1,2}结果是9
file
结果完全正确,
第9个度量值:

销售表-列all:=SUMX(ALL('销售'),'销售'[数量])

ALL('销售')取整个表,sumx取的是行上下文的每行的数量,所以结果是7,与外部筛选上下文没有关系,
file
第10个度量值:

销售表-表all-sum:=SUMX(ALL('销售'),SUM('销售'[数量]))

sumx第一参数取得是整个表,第二参数是个聚合函数,和当前行没有直接关系,因为外部有个筛选上下文,所以SUM('销售'[数量]计算了这个子集,产品A数量4,产品B数量3,因为SUM('销售'[数量]处于行中,所以会迭代整个表5行,
第一行45=20
第二行3
5=15
总计行 7*5=35
file
第11个度量值:

销售表-filter- all:=SUMX(FILTER(ALL('销售'),'销售'[产品]="A"),'销售'[数量])

sumx第一参数因为all函数不会接受外部筛选,filter 筛选出产品A的所以行3行,添加一个计算列,所以结果4,和外部没有关系
每行都是4
file
第12个度量值:

销售表-all-sum:=SUMX(FILTER(ALL('销售'),'销售'[产品]="A"),SUM('销售'[数量]))

第一参数和上面一样不受外部影响,SUM('销售'[数量]会接受筛选上下文,
第一行SUM('销售'[数量])结果4,迭代第一参数3行34=12
第二行SUM('销售'[数量])结果3,迭代第一参数3行3
3=9
总计sum计算7,迭代3*7=21
file
第13个度量值:

销售表-all度量值:=SUMX(FILTER(ALL('销售'),'销售'[产品]="A"),[数量 的总和])

sumx第一参数3行含A的表,不受外部筛选,sumx第二参数是个度量值,[数量 的总和]会接受二个筛选器,一个是外部上下文,一个是内部行上下文,二个上下文存在矛盾冲突,只考虑内部行上下文转换筛选上下文,内部转换后的结果是{2,2,2},结果是6,有因为与外部筛选器无关,所以每行都一样,总计也是6
file


双层迭代系列

第14个度量值:

sumx-sumx-列:=SUMX('销售',SUMX('销售','销售'[数量]))

透视表外部有个产品筛选上下文,sumx内部销售表只有部分可见,第二个sumx
第一行产品A可见,3行,取每行的数量,第二个sumx第二参数迭代计算{1,2,1}结果是4,第一个sumx迭代结果表{4,4,4},结果12,
第二行原理一样结果6;
总计行第二个sumx结果{1,2,1,1,2}结果是7,,第一个sumx新的行上下文{7,7,7,7,7}结果是35
file
第15个度量值:

sumx-sumx-sum:=SUMX('销售',SUMX('销售',SUM('销售'[数量])))

第二个sumx第二参数是个聚合函数,会接受外部筛选上下文,
第一行第二个sumx内部SUM('销售'[数量])计算的结果是4,内部迭代{4,4,4},结果12,第一个sumx迭代的表是{12,12,12}结果36,
第二行,内部迭代的表{3,3}结果是6,外部迭代的表{6,6}结果是12,
总计行内部迭代的表{7,7,7,7,7}结果是35,外部迭代的表{35,35,35,35,35}结果175
file
第16个度量值

sumx-sumx-度量值:=SUMX('销售',SUMX('销售',[数量 的总和]))

外部存在一个筛选上下文所以销售表部分可见,[数量 的总和]外部环境二个行上下文和一个筛选上下文,内部迭代的是扩充表,所以外部筛选器可以忽略了,只考虑内部行上下文的筛选器,
第一行内部sumx迭代的结果表{2,2,2}结果是6,外层迭代的表是{6,6,6}结果是18
第二行内部迭代的是{1,2}结果是3,外层sumx迭代的结果表{3,3}结果是6
总计行销售部没有外部筛选上下文,所以迭代整张表,内部迭代的结果表{2,2,2,1,2}结果9,外层迭代的结果表{9,9,9,9,9}结果是45
file
全部度量值请参考下面
file

上面所有的这些都是些行上下文转换筛选上下文,和筛选上下文的一些基础,如果要更深的理解上下请参考张文洲的视频课
目前国内最权威的dax专家,视频课链接
https://study.163.com/course/introduction/1003801005.htm
更多交流请入群file