需求
结果展示
原始数据结构
实现
1.生成日历表
2
预测销售额1=
var v_snp_cnt = sum(sales[销售额])
//求订单数据中的最大月份
var v_max_mth = format(calculate(max(sales[月份]),all(sales[sales])),"yyyy/mm")
var v_prod_type = selectedvalue(sales[产品种类])
//最大月份对应产品已有销售额,由于最终在视觉对象中显示,会包含外部切片器的筛选条件,因此需要用allselected
var v_max_mth_sum = calculate(sum(sales[销售额]),
filter(allselected(sales),
format(sales[月份],"yyyy/mm") = v_max_mth&&sales[产品种类]=v_prod_type))
//当前月份最大日期
var v_max_date = calculate(max(sales[日期]),all(sales))
//当前月一号到当前月最大销售日中有多少个自然日,用没有建立关系的calendar2取值。原因是订单表与calendar建立了关系,calendar的上下文会受视觉对象上下文的影响
var_cnt_day = calculate(count(calendar2[date]),
calendar2[year month] = format(v_max_date,"YYYY/MM"),calendar2[date]<=v_max_date)
//当月剩下多少自然日
var v_remain_day = calculate(count(calendar2[date]),
calendar2[year month] = format(v_max_date,"YYYY/MM"),calendar2[date]>v_max_date)
//根据前面几天的平均销量计算当月剩下天的销量
var v_forecast_snp_cnt = divide(v_max_mth_sum,v_cnt_day)*v_remain_day + vmax_mth_sum
//当前上下文中的月份
var v_mth = selectedvalue(calendar1[year month])
var v_cur_mth = format(v_max_date,"yyyy-mmmm")--最大月份
return if(v_mth = v_cur_mth,v_forecast_snp_cnt,v_snp_cnt)
预测销售额2=
var v_snp_cnt = sum(sales[销售额])
//求订单数据中的最大月份
var v_max_mth = format(calculate(max(sales[月份]),all(sales[sales])),"yyyy/mm")
var v_prod_type = selectedvalue(sales[产品种类])
//最大月份对应产品已有销售额,由于最终在视觉对象中显示,会包含外部切片器的筛选条件,因此需要用allselected
var v_max_mth_sum = calculate(sum(sales[销售额]),
filter(allselected(sales),
format(sales[月份],"yyyy/mm") = v_max_mth&&sales[产品种类]=v_prod_type))
//当前月份最大日期
var v_max_date = calculate(max(sales[日期]),all(sales))
//当前月一号到当前月最大销售日中有多少个工作日
var_cnt_day = calculate(count(calendar2[date]),
calendar2[year month] = format(v_max_date,"YYYY/MM"),calendar2[date]<=v_max_date,not calendar2[day of week] in (6,7))
//当月剩下多少自然日
var v_remain_day = calculate(count(calendar2[date]),
calendar2[year month] = format(v_max_date,"YYYY/MM"),calendar2[date]>v_max_date)
//根据前面几天的平均销量计算当月剩下天的销量
var v_forecast_snp_cnt = divide(v_max_mth_sum,v_cnt_day)*v_remain_day + vmax_mth_sum
//当前上下文中的月份
var v_mth = selectedvalue(calendar1[year month])
var v_cur_mth = format(v_max_date,"yyyy-mmmm")--最大月份
return if(v_mth = v_cur_mth,v_forecast_snp_cnt,v_snp_cnt)
一些知识
1.长度量值要分步调试,可以利用卡片图等简单的视觉对象返回分步结果。
2.不同度量值写法适用于不同的视觉对象,这意味着我们在设计度量值时,已经对展现结果有了相应的预期;因此,当最终展现的视觉对象有变化时,很可能需要对度量值进行修改。
上述度量值适用于图例为产品,横轴为月份的堆叠柱状图(见结果展示图)
对于图例为月份横轴为客户的条形图(如下图),需要修改元度量值v_prod_type为客户
修改后的度量值如下