最近事情比较多,学习的速度也慢了下来,惭愧。
白茶对近一个月所学的DAX进行了一次梳理,做出了一个动态多维度的帕累托图,效果如下。
这个动图包含了最近所学的相关DAX函数,那么是如何实现的呢?
这是本次,白茶所使用的一份示例数据,可以说是白茶使用频率最高的一份样例了。导入PowerBI中,系统会自动匹配模型关系,如下图:
这是前期的准备工作,接下来开始对近期所学的相关知识进行梳理。
一、编写基本的销售金额、成本、利润代码,如下:
销售金额代码:
销售金额 =
SUMX ( '销售明细', '销售明细'[销售数量] * RELATED ( '产品表'[销售价] ) )
成本代码:
销售成本 =
SUMX ( '销售明细', '销售明细'[销售数量] * RELATED ( '产品表'[成本] ) )
利润代码:
利润 =
[销售金额] - [销售成本]
结果如图:
这里面涉及到的知识点是:
当相关数据没在一个表格里面时,我们不能使用SUM进行聚合,需要使用迭代循环SUNX以及RELATED函数。
二、确立维度
通常情况下一组数据我们需要观测的维度大概也就是三方面:时间、财务、具体内容切换。
①、时间维度好说,可以看得出来事实表中自带销售日期,选取年份字样放入切片器中即可,结果如下:
具体的样式可以去点击右上角调整。
也可以去设置中调整。
这样就得到了符合我们心里预期的大致效果,具体的细节根据个人喜好去调整,这里就不赘述了。如果对销售日期不满意,也可以利用相关函数生成自己的日期表。后面的财务、观测维度设置方法也是一样的,不赘述。
②、财务维度。财务维度说白了,就是利用切片器,可以动态的切换数据。
点击输入数据,确定自己的表名,在列值中分别输入销售金额,利润,结果如下:
接下来,输入代码,将没有关系的维度与度量值建立关系。
SWITCH写法 =
SWITCH (
TRUE (),
SELECTEDVALUE ( '财务维度'[财务维度] ) = "利润", [利润],
SELECTEDVALUE ( '财务维度'[财务维度] ) = "销售金额", [销售金额],
BLANK ()
)
这里涉及到的是SWITCH函数与SELECTEDVALUE函数,当然也可以用IF进行判断,这里就不赘述了,结果如下:
③、坐标维度。所谓的观测维度,其实也就是坐标维度,其根本原理,是将原本不在一个表中的数据,利用DAX建立在一个表格中,使其同处于一个维度之下,再利用虚拟关系,将原本没有联系的表格强行建立关系。
建立维度表,输入如下代码:
名称与分店维度 =
VAR BC1 =
SELECTCOLUMNS (
ADDCOLUMNS ( DISTINCT ( '分店表'[分店名] ), "名称与分店", "分店" ),
"名称与分店", [名称与分店],
"具体内容", [分店名]
)
VAR BC2 =
SELECTCOLUMNS (
ADDCOLUMNS ( DISTINCT ( '产品表'[商品名称] ), "名称与分店", "商品名称" ),
"名称与分店", [名称与分店],
"具体内容", [商品名称]
)
RETURN
UNION ( BC1, BC2 )
结果如图:
在建模卡片下选择新表,输入DAX函数,得到我们需要的统一坐标维度表。
再输入如下代码将原本没有联系的数据建立关系:
分析数据 =
VAR BC3 =
TREATAS ( VALUES ( '名称与分店维度'[具体内容] ), '产品表'[商品名称] )
VAR BC4 =
TREATAS ( VALUES ( '名称与分店维度'[具体内容] ), '分店表'[分店名] )
RETURN
SWITCH (
TRUE (),
SELECTEDVALUE ( '名称与分店维度'[名称与分店] ) = "商品名称", CALCULATE ( [SWITCH写法], BC3 ),
SELECTEDVALUE ( '名称与分店维度'[名称与分店] ) = "分店", CALCULATE ( [SWITCH写法], BC4 ),
BLANK ()
)
选择柱型折线图,将具体内容作为共享坐标轴,将分析数据放入列值中,结果如下:
这样的话我们就得到一个动态数据与动态坐标结合在一起的动态图,可以随意的切换三种维度。涉及到的一些相关函数,在这里就不赘述了。
三、帕累托累计占比
三种维度我们得到了,接下来就是来编写累计、占比、以及累计占比的代码。
累计代码:
累计 =
SWITCH (
TRUE (),
SELECTEDVALUE ( '财务维度'[财务维度] ) = "利润", CALCULATE ( [利润], ALLSELECTED ( '销售明细'[销售数量] ) ),
SELECTEDVALUE ( '财务维度'[财务维度] ) = "销售金额", CALCULATE ( [销售金额], ALLSELECTED ( '销售明细'[销售数量] ) )
)
占比代码:
占比 =
DIVIDE( [分析数据], [累计] )
累计占比代码:
累计占比 =
VAR SQ = [占比]
RETURN
CALCULATE ( [占比], FILTER ( ALL ( '名称与分店维度'[具体内容] ), [占比] >= SQ ) )
将累计占比的代码放入刚才的可视化插件,放在行值位置。结果如下:
我们会发现似乎有些地方不对劲啊,有一些商品在2017年这个维度上是没有消费的啊,不应该进行累计的啊!简单,记得白茶之前提到过的筛选空值么?优化我们的代码。
累计占比 =
VAR SQ = [占比]
RETURN
IF (
[分析数据] <> 0,
CALCULATE (
[占比],
FILTER ( ALL ( '名称与分店维度'[具体内容] ), [占比] >= SQ && [分析数据] <> 0 )
)
)
结果如图:
这次是不是很完美?
四、参数分类
那么动态的帕累托图到这里告一段落了,但是我们并没有对数据优先级进行判定啊?这里需要我们添加参数值。
在建模窗格下,选择添加参数,分别添加三个参数,ABC。
参数A:
DAX=
GENERATESERIES( 1, 100, 1 )
参数B:
DAX=
GENERATESERIES( 0, 100, 1 )
参数C:
DAX=
GENERATESERIES( 0, 100, 1 )
这里说一下,问什么参数A的初始值是1,这是为了防止后面的计算出现问题。
将三个参数值放入环形图中,添加切片器,这是为了方便我们在实际使用中能随时对ABC三类划分权重。
添加ABC三类的比例权重。
总体:
参数总体 =
[参数A 值] + [参数B 值] + [参数C 值]
A类:
A类比例 =
DIVIDE([参数A 值],[参数总体])
B类:
B类比例 =
DIVIDE([参数B 值],[参数总体])
C类:
C类比例 =
DIVIDE([参数C 值],[参数总体])
接下来,对数据进行判定分类,划分出三种结果。输入如下代码:
优先级 =
VAR BC = [累计占比]
RETURN
SWITCH ( TRUE (), BC <= [A类比例], "优先", BC <= [A类比例] + [B类比例], "其次", "最后" )
将其放入矩阵中查看,结果如图:
会发现又出现之前的毛病了,咋办,优化代码呗:
优先级 =
VAR BC = [累计占比]
RETURN
IF (
[分析数据] <> 0,
SWITCH ( TRUE (), BC <= [A类比例], "优先", BC <= [A类比例] + [B类比例], "其次", "最后" )
)
结果如下:
是不是结果看起来舒服了很多?
五、优化
剩下最后的步骤,就是对各个可视化插件进行细节上的优化处理了,这里就不过多的赘述了。
颜色配置,大小什么的,可以按照个人喜好的来。
当然,也可以添加一个关于ABC三类计数的表格,以及一个销售趋势图,让你的报表看起来格调更高。