需求
实现如下结构的报表
基础日历表如下
实现
度量值 销售额 = sum(order_2[订单金额]) -- 算出当前上下文的销售额
度量值 上月销售额 = calculate(sum(order_2[订单金额]),dateadd(['date'[date]],-1,month))
// 从当前上下文中取出日期,倒退一个月计算销售额
度量值 月环比 = divide([销售额]-[上月销售额],[上月销售额])
度量值 去年同期销售额 = calculate([销售额],sameperiodlastyear('date'[date]))
//calculate([销售额],dateadd('date'[date],-1,year))
度量值 选中季度销售额=
var v_current_year_qtr= selectedvalue('date'[yearqtr])
//返回当前选中日期对应的季度
return calculate(sum(order_2[订单金额]),
filter(all('date'),'date'[yearqtr]= v_current_year_qtr)
)
//去除date表上所有筛选器,返回符合季度的日期记录作为计算销售额的筛选上下文
度量值 选中季度对应上个季度销售额=
var v_current_qtr = selectedvalue('date'[yearqtr])
//get current qtr --2020 May --2020q2
var v_current_qtr_begin = minx(
filter(all('date'),'date'[yearqtr]=v_current_qtr), --返回当前季度的日期表,注意,如果不用all拿掉date表上的筛选,又加上新的筛选,可能会返回一空表或错误
'date'[date] --取出日期字段
)
//current qtr begin date
var v_pre_qtr_begin = dateadd(
filter(all('date'[date]),'date'[date]=v_current_qtr_begin),-- 返回当前季度的第一天
-3,
month --倒退三个月,取到上季度开始
)
)
// previous qtr begin date
return
calculate(
sum(order_2[订单金额]),
filter(all('date'),'date'[date]>=v_pre_qtr_begin && 'date'[date]<v_current_qtr_begin)
) -- 20200101 and < 20200401
// previous qtr sales amount -- 20200101
//简单写法1:calculate(sum(order_2[订单金额]),previousquater('date'[date])) -- 当前上下文的上个季度销售额
//简单写法2:calculate(sum(order_2[订单金额]),nextquater('date'[date])) -- 当前上下文的下个季度销售额
dax的上下文影响无处不在,在报表交互层面,用户可见的只是选中了的某个具体日期,但是在原始数据层面,这个日期是一个单元格,拥有自己的行上下文;在模型层面,ta处于某个关系的一端,拥有自己的筛选上下文,因此能灵活对应到其他不同字段;在报表层面,前两者被嵌入了视觉对象的代码块中,综合形成了最终的交互结果。这种隐式规则是powerbi报表可交互的核心原理。却不能仅从用户自己写的代码中被窥见,所以在刚开始学习的时候觉得难以理解。
果然很有趣!我觉得GPT暂时学不会ta哈哈哈