小伙伴们大家好!
☞DAX综合实战案例-简单的中国式报表详解(一)
☞DAX综合实战案例-简单的中国式报表详解(二)
中讲解了中国式表头的构建,按列排序,时间智能函数,这些菜都已经做好,最后一步就是拼盘了,如何把它们按照需要的样子拼在一起呢?
接下来就处理这个问题。
我们再来看下报表的样子:
报表先是展示各月的预算达成情况,然后是年累计、上年全年、上年年累计情况,最后是差异比较。表头通过按列排序已经实现了,现在就是要把对应的度量也体现在对应的表头下面。
还是要用到DAX公式来实现。报表的行列筛选是一种外部筛选,如何通过DAX控制来实现这一效果呢?可以考虑用SWITCH+SELECTEDVALUE的方式来实现。
比如,各月的预算、达成、达成率度量可以这么写:
LMeasure=
SWITCH(TRUE(),
//各月度预算、达成、达成率
SELECTEDVALUE('表头'[L1])="月份"&&SELECTEDVALUE('表头'[L3])="预算",
CALCULATE('事实表'[预算额],TREATAS(VALUES('表头'[L2]),'日期表'[月份]),YEAR('事实表'[Date])=YEAR(TODAY())),
SELECTEDVALUE('表头'[L1])="月份"&&SELECTEDVALUE('表头'[L3])="达成",
CALCULATE('事实表'[达成额],TREATAS(VALUES('表头'[L2]),'日期表'[月份]),YEAR('事实表'[Date])=YEAR(TODAY())),
SELECTEDVALUE('表头'[L1])="月份"&&SELECTEDVALUE('表头'[L3])="达成率",
CALCULATE('事实表'[达成率],TREATAS(VALUES('表头'[L2]),'日期表'[月份]),YEAR('事实表'[Date])=YEAR(TODAY()))
通过SELECTEDVALUE获得表头L1字段和表头L3字段的筛选(以上筛选的是月份及对应的预算达成,这是外部筛选),TREATAS(VALUES(‘表头’[L2]),‘日期表’[月份]),YEAR(‘事实表’[Date])=YEAR(TODAY())这是公式筛选,把当前年月的度量计算出来,通过TREATAS使得表头L2与日期表的月份建立虚拟关系,而日期表又与事实表存在物理关系,通过表关联传递筛选关系,进而计算出对应筛选条件下的度量。
同样的道理,今年年累计的度量如下:
LMeasure0 =
SWITCH(TRUE(),
//今年累计预算、达成、达成率
SELECTEDVALUE('表头'[L1])="总计"&&SELECTEDVALUE('表头'[L3])="预算"&&SELECTEDVALUE('表头'[L2])="今年全年",
'事实表'[预算_YTD2],
SELECTEDVALUE('表头'[L1])="总计"&&SELECTEDVALUE('表头'[L3])="达成"&&SELECTEDVALUE('表头'[L2])="今年全年",
'事实表'[达成_YTD],
SELECTEDVALUE('表头'[L1])="总计"&&SELECTEDVALUE('表头'[L3])="达成率"&&SELECTEDVALUE('表头'[L2])="今年全年",
'事实表'[达成率_YTD])
上年全年、上年年累计和差异对比都是一样的套路,完整的公式如下:
LMeasure0 =
SWITCH(TRUE(),
//各月度预算、达成、达成率
SELECTEDVALUE('表头'[L1])="月份"&&SELECTEDVALUE('表头'[L3])="预算",
CALCULATE('事实表'[预算额],TREATAS(VALUES('表头'[L