案例
我们想要建立一个柱状图,横坐标可以通过切片器切换,内容分别为 年份、产品、城市
纵坐标也可以通过切片器切换,内容分别为销量或者销售金额
而要完成这个功能,我们需要将横坐标单独做一个表,表的内容为笛卡尔积形式的。将 年份、产品和城市和他们三个包含的内容通过笛卡尔积的形式列出来。
纵坐标同理,需要将销售量和销售金额,以及具体的销售量和销售金额的度量值表示出来。
之后便可以通过SWITCH函数以及SELECTEDVALUE函数,将要筛选的内容通过柱形图表示出来。
我们分别建立三个 年份、产品、城市 的单行单列的表
ROW(“年份1”, “年份”)
ROW(“产品1”, “产品”)
ROW(“城市1”, “城市”)
然后将案例表中的年份、产品和城市通过VALUE函数筛选出一个不重复的单列表来
VALUES(‘案例’[年份])
VALUES(‘案例’[产品])
VALUES(‘案例’[城市])
然后使用笛卡尔积函数
年份 = CROSSJOIN( ROW(“年份”, “年份”), VALUES(‘案例’[年份]))
产品 = CROSSJOIN(ROW(“产品”, “产品”), VALUES(‘案例’[产品]))
城市 = CROSSJOIN(ROW(“城市”, “城市”), VALUES(‘案例’[城市]))
然后我们将这三个表通过UNION函数连接起来,生成一个新的表
表1 = UNION(‘年份’ , ‘产品’)
横坐标 = UNION(‘表1’ , ‘城市’)
即:
横坐标 = UNION(
UNION(CROSSJOIN( ROW("年份1", "年份"), VALUES('案例'[年份])) ,
CROSSJOIN(ROW("产品1", "产品"), VALUES('案例'[产品])
),
CROSSJOIN(ROW("城市1", "城市"), VALUES('案例'[城市]))
)
手动更改一下表的名字。
同理,我们再来建一个纵坐标的表
ROW(“类别”,“总销量”)
ROW(“类别”,“总销售金额”)
纵坐标 = UNION(ROW(“类别”,“总销量”),ROW(“类别”,“总销售金额”))
而我们的柱状图的值为总销量、总销售金额两个度量值
总销量 = SUM(‘案例’[销量])
总销售金额 = SUM(‘案例’[销售金额])
现在我们准备好了横坐标、纵坐标和值
我们需要在使用切片器选择不同的横坐标和纵坐标的时候,表格的坐标内容和度量值能相应的变化,就需要我们判断所选的内容。
因为该图的表达涉及到坐标轴的选择,一个坐标轴在同一时间有且只能有一个选择,所以我们需要使用SELECTEDVALUE函数将切片器所选的坐标轴给返回。
因为需要判定所选的坐标轴为所有备选内容中的哪一个,所以需要用到SWITCH函数
因为用坐标轴表和案例表是没有产生联系的,所以如果想通过坐标轴来筛选案例表中的内容,需要使用TREATAS函数,用第一个参数筛选第二个参数。
因此,当想要显示金额的时候,因为切片器已经对横坐标的大类做好了选择,我们只需要筛选大类下的内容作为横坐标即可,在不同横坐标下需要显示的两个度量值表达式如下:
显示销量 = SWITCH(
SELECTEDVALUE(‘横坐标’[横坐标]),
“年份”, CALCULATE([总销量], TREATAS(VALUES(‘横坐标’[类别]), ‘案例’[年份])),
“产品”, CALCULATE([总销量], TREATAS(VALUES(‘横坐标’[类别]), ‘案例’[产品])),
“城市”, CALCULATE([总销量], TREATAS(VALUES(‘横坐标’[类别]), ‘案例’[城市])),
“”)
显示金额 = SWITCH(
SELECTEDVALUE(‘横坐标’[横坐标]),
“年份”, CALCULATE([总销售金额], TREATAS(VALUES(‘横坐标’[类别]), ‘案例’[年份])),
“产品”, CALCULATE([总销售金额], TREATAS(VALUES(‘横坐标’[类别]), ‘案例’[产品])),
“城市”, CALCULATE([总销售金额], TREATAS(VALUES(‘横坐标’[类别]), ‘案例’[城市])),
“”)
横坐标的切片器筛选做好了,同理可得纵坐标的筛选器表达式为:
纵坐标值 = SWITCH(
SELECTEDVALUE(‘纵坐标’[类别]),
“总销量”, [显示销量],
“总销售金额”, [显示金额]
)
将类别拖到纵坐标中,纵坐标值拖到值中,即可显示
我们还可以将 后面三个度量值 显示销量、显示金额、纵坐标值 通过VAR来合并成一个度量值:
纵轴值 =
VAR salesvolume = SWITCH(
SELECTEDVALUE(‘横坐标’[横坐标]),
“年份”, CALCULATE([总销量], TREATAS(VALUES(‘横坐标’[类别]), ‘案例’[年份])),
“产品”, CALCULATE([总销量], TREATAS(VALUES(‘横坐标’[类别]), ‘案例’[产品])),
“城市”, CALCULATE([总销量], TREATAS(VALUES(‘横坐标’[类别]), ‘案例’[城市])),
“”)
VAR salesmount = SWITCH(
SELECTEDVALUE(‘横坐标’[横坐标]),
“年份”, CALCULATE([总销售金额], TREATAS(VALUES(‘横坐标’[类别]), ‘案例’[年份])),
“产品”, CALCULATE([总销售金额], TREATAS(VALUES(‘横坐标’[类别]), ‘案例’[产品])),
“城市”, CALCULATE([总销售金额], TREATAS(VALUES(‘横坐标’[类别]), ‘案例’[城市])),
“”)
return
SWITCH(
SELECTEDVALUE(‘纵坐标’[类别]),
“总销量”, salesvolume,
“总销售金额”, salesmount )
度量值还可以定义新的列
评价 =
VAR zongfen = ‘案例2’[数学学] + ‘案例2’[语文]
return
if(zongfen >= 160, “优秀”,“一般”)