本帖最后由 张文洲 于 2015-6-12 12:49 编辑
二、如何跳出计算字段默认的条件计算模式
上节介绍了计算字段会按照数据透视表的行标签、列标签、筛选区域(分页区域)、切片器、日程表的当前值对数据模型中表进行筛选以后再进行聚合计算,这是计算字段的默认计算模式。 那么我们如何跳出这一默认计算模式呢?
1.如下图,我想创建一个字段,计算每个仓库总的入库数,而不考虑商品品种,也就是想忽略行标签的值不进行筛选。
因为普通的SUM(’DATA’[入库])是按照默认的计算模式来计算的,我们需要更高级的条件计算函数,这就是经常使用的CALCULATE函数 语法是: CALCULATE(<EXPRESSION>,<FILTER1>,<FILTER2>…) EXPRESSION是计算表达式,可以嵌套SUM/MAX/MIN/COUNT/AVERAGE……, FILTER1是筛选条件1,FILTER1是筛选条件2…… 这个函数类似于工作表中SUMIFS/COUNTIFS函数,只不过这个函数一个函数可以取代多个函数,而且还可实现类似于MAXIFS/MINIFS等函数的功能 需要强调的是,这个函数中的筛选条件比透视表中的行列标签、筛选区域、切片器、日程表中的筛选值具有更高的优先级, 也就是说这个函数中的FILTER条件与透视表中的条件有相同的字段条件,函数计算会忽略透视表中的条件 举个例子,比如我想计算丙商品的入库数,不管当前行标签是什么商品,我总是计算丙商品的入库数 可以用这个公式 丙入库合计 =CALCULATE(SUM(DATA[入库]),DATA[商品名称]="丙") 其中SUM(DATA[入库])就是EXPRESSION,当然我也可以把SUM换成MAX/MIN/COUNT等,这个参数指定计算方式 DATA[商品名称]="丙"是FILTER1,就是筛选条件1.这里只有一个条件,我们可以设置其他多个条件 图中E4:E6虽然对应的行标签分别是丙甲乙,但是因为函数中已经有DATA[商品名称]="丙"的条件限制,因此会忽略透视表的行标签。
当然,如果透视表中的列标签、日程表、切片器等有筛选值,也同样会被忽略。
2.不知道有没有注意到,DATA[商品名称]="丙"中的条件“丙”是一个固定值,如果我想选择全部商品,达到下图效果,
那么条件如何设置呢?这里就要简单介绍我们的ALL函数 先把计算字段显示出来 仓库入库合计 = CALCULATE(SUM(DATA[入库]),ALL(DATA[商品名称])) 其中第二个参数ALL(DATA[商品名称])是ALL函数返回的一个筛选值。ALL函数的语法是 ALL (COLUMN[,COLUMN[, …]]) 这个可以选择某一列或某几列的所有值, 也就是说计算字段在计算时会忽略透视表中所有筛选条件对ALL函数中出现的列进行的筛选, 或者 ALL(TABLE)
计算字段在进行计算时会忽略透视表中所有筛选条件对这个表进行的筛选。
|