1、度量值与关系模型
1、查看关系模型
- 导入数据
点击左侧【数据】,可以查看表中数据。
2.关系模型
可以看到,商品表和销售表是一对多的关系;门店和销售表也是一对多的关系。
2、创建度量值
1.度量值概念
度量值就是对表中数据求和、最大、平均等。如果想获取所有销售数量的最大、最小,在Excel中也非常方便来做,但是如果想获取某天销售额的最大、最小,就不是很方便了,可以使用PowerBI。
2.创建度量值
度量值一般都放到一张表中。
点击【输入数据】,将表名称修改为度量值,则在字段菜单可以看到有一个表为“度量值”,里面的列是空的。
选中【度量值】表,点击【新建度量值】,计算
总销售数量 = sum('销售表'[销售数量]) 最大销售数量 = MAX('销售表'[销售数量]) 最小销售数量 = min('销售表'[销售数量]) 平均销售数量 = AVERAGE('销售表'[销售数量]) 总订单数 = COUNTROWS('销售表')
3.在【可视化】菜单中选择【矩阵】,拖动【门店名称】到行,拖动【总销销售数量】、【平均销售数量】、【总订单数】等到值。
4.修改图标的样式,如添加标题、颜色、字体。拖动销售表【日期】到行,可以删除日期中不想要的如(季度、月)等信息,也可钻取显示。
2、向下钻取与数据导出
- 获取数据
- 在视图窗口中选中【饼图】,将【品种】、【品牌】、【型号】依次拖到到图例,【销量】拖动到值
- 修改【格式】–【详细信息】–【大小】和标签位置
- 钻取功能
筛选
5.选择【筛选器】进行筛选。
导出
选择【文件】-【导出】
选择指定路径导出,这样其他工作人员就可以直接打开你导出的pbit。
如果想在打开的pbit文件中导出数据,直接点击钻取一行最后的[…],选择【导出数据】。
如果想获取全部数据,选择左侧数据,右键选择【复制表】就可以复制全部数据。如果想获取某列数据选中列侯选择【复制】即可。
3、新建列与关系函数
示例-获取每件商品的销售金额
每件商品的销售金额=商品的单价*商品的数量
1、LOOKUPVALUE
语法:
语法: LOOKUPVALUE(要返回的值,哪张表中搜索哪列,自己表根据哪列查找,[查找的列],[查找的值]…[当返回值有0个或多个时,默认返回的值])
返回满足一个或多个列匹配条件所对应的值
参数:
第一参数:包含要返回的值的现有列的名称。 它不能是表达式。
第二参数:现有列的名称(要查找的范围),可以是第一参数表中的列,也可以是相关表中的列,但不能是表达式
第三参数:要在第二参数中查找的值
第四、五…参数:(可选)同第二、三参数,必须成对出现
最后一个参数:(可选)当满足查找条件返回的值为0个或多个时,默认返回的值。
2、使用同表中的数据新建列
在销售表中【新建列】为【售价】
售价 = LOOKUPVALUE('商品表'[售价],'商品表'[商品编码],'销售表'[商品编码])
在销售表中【新建列】为【销售金额】
销售金额 = '销售表'[销售数量]*'销售表'[售价]
2、使用关系函数新建列
上面的方式可以实现,但是必须先创建【售价】这列,如果不想创建【售价】我们该怎么办呢?可以使用函数:
多端找一端 RELATED
在销售表中【新建列】为【销售金额2】
销售金额2 = [总销售数量]*RELATED('商品表'[售价])
示例-每件商品有多少订单
一端找多端 RELATEDTABLE
在商品表中【新建列】
订单数 = COUNTROWS(RELATEDTABLE('销售表'))
4、Calculate引擎
1、Calculate引擎
1、筛选单个
CALCULATE(计算器,筛选器) 计算器=度量值
示例-电视销量
新建度量值【电视销量】
电视销量 = CALCULATE([总销售数量],'商品表'[商品编码]="A03")
2、筛选多个
筛选多个使用in 或 not in
不包含电视的销量
不包含电视的销量 = CALCULATE([总销售数量],'商品表'[商品名称] in {"A01","A02","A04"})
冰箱的销售数量使用not in实现
冰箱的销量 = CALCULATE([总销售数量],not '商品表'[商品编码] in {"A01","A03","A04"})
3、筛选多个条件
示例:商品编码等于“A03“和进价=2200
多条件 = CALCULATE([总销售量],'销售表'[商品编码]="A03" ,'商品表'[进价]=2200)
5、Calculatedtable筛选表
1、Calculatedtable筛选表
示例:电视的所有销售订单创建一张新表
选择【表工具】中【新建表】
电视机销售表 = CALCULATETABLE('销售表','销售表'[商品编码]="A01" )
2、切片器的使用
如果想根据商品名称查看商品销量,可以使用【切片器】
1.选择【矩阵】,拖动【门店】到行,【总销售量】到值
2.选择【切片器】,拖动【商品名称】到行
3.修改显示样式,
6、高级筛选器Filter与Values人工造表
返回一个表,用于表示另外一个表或表达式的子集,不能单独使用
Filter函数对筛选的表进行横向的逐行扫描,这样的函数叫迭代函数
1、基本使用
高级筛选器Filter。
Filter(‘表’, 筛选条件)
返回:表
Countrows(Filter(表,筛选条件))
示例-筛选“电视”的订单数量
新建度量值:电视的订单数量
电视机的订单数量 = COUNTROWS(FILTER('销售表','销售表'[商品编码]="A03" ))
2、什么时候使用Filter函数呢?
示例:电视机的销量
电视机销量1 = CALCULATE([总销售量],'商品表'[商品编码]="A03" ) 电视机销量2 = CALCULATE([总销售量],FILTER('商品表','商品表'[商品编码]="A03" ))
可以看到实现的效果是一样的,那什么时候使用Filter、什么时候不使用Filter呢?
在Calculate函数中的直接筛选条件里,我们只能输入:
‘表’[列] = 固定值 或 ‘表’[列] <> 固定值 ‘表’[列] >= 固定值 或 ‘表’[列] <= 固定值 ‘表’[列] > 固定值 或 ‘表’[列] < 固定值
但是遇到如下情况,就要使用Filter函数
[列]=[度量值]、 [列]=公式、[列]=[列] [度量值]=[度量值]、 [度量值]=公式、[度量值]=固定值
示例-各门店电视销量大于40的
总销售数量 = sum('销售表'[销售数量]) 电视销量 = CALCULATE([总销售数量],'商品表'[商品编码]="A03") filter电视销量 = CALCULATE([电视销量],FILTER('门店',[电视销量]>40))
3、Values人工造表
Filter函数中使用的表必须是一端的表,我们使用【门店】可以显示,使用【销售表】可以看到没有办法显示,这时候可以使用Values函数人工造表
filter电视机销量2 = CALCULATE([电视机销量1],FILTER('销售表',[电视机销量1]>40))
filter电视机销量3 = CALCULATE([电视机销量1],FILTER(VALUES('销售表'[商品编码]),[电视机销量1]>40))
7、上下文
1、新建列是行上下文
可以看到在每行上都显示746
2、度量值是筛选上下文
创建【度量值】总销售数量
可以筛选各门店的销售数量。
总结:
- 度量值天生具有筛选功能
- 新建列是行上下文,行上下文没有筛选功能
- 想让行上下文实现筛选功能就要在外套一个calculate函数
8、x系列函数
x系列函数有:SUMX、AVERAGEX、MINX、MAXX用法相同。
语法:
Sumx('表名',算术表达式)
- 逐行扫描
- 执行运算,每一行都会返回一个值
- Sumx函数记住了每一行返回的值,最后把所有的值相加求和
示例:在【销售表】新建列【毛利1】
毛利1 = SUMX('表',[销售金额]-[销售成本])
可以看到毛利1这列返回的值不是该销售记录的毛利,而是对所有毛利进行求和。如果想获取所对应的毛利,则需要添加calculate函数
毛利2 = CALCULATE(SUMX('表',[销售金额]-[销售成本]))
9、Earlier函数
Earlier函数:获取当前行
Earlier(表[列])
示例:某商品累计销量
filter('销售表','销售表'[货号] =earlier('销售表'[货号])) '销售表'[销售日期]<= earlier('销售表'[销售日期]) 销售累计 = sumx(FILTER(FILTER('销售表','销售表'[货号] =earlier('销售表'[货号])),'销售表'[销售日期]<= earlier('销售表'[销售日期])),'销售表'[销量])
10、安全除法与逻辑判断
1、安全除法
可以看到分母为0 时候,没有结果。安全出发指如果分母为0时候,结果为0
安全除法 = DIVIDE([分子],[分母],0)
2、逻辑判断
如果显示数据表头没有
选中【字段】中的表,右键【编辑查询】,选择【将第一行用作标题】,点击【关闭并应用】
1.IF(logical_test>,<value_if_true>, value_if_false) --检查是否满足作为第一个参数提供的条件。 如果该条件为 TRUE,则返回一个值; 如果该条件为 FALSE,则返回另一个值,用法与excel类似
称呼 = IF('称呼'[性别]="男","先生","女士")
2.SWITCH(<expression>,条件1,值1,条件2,值2) --根据值列表计算表达式, 并返回多个可能的结果表达式之一。
示例:switch表中新建列 【月份】
月份 = SWITCH('switch'[Column1], 1,"一月", 2,"二月", 3,"三月", 4,"四月", 5,"五月", 6,"六月", 7,"七月", 8,"八月", 9,"九月", 10,"十月", 11,"十一月", 12,"十二月", "未能识别")
注意:如果表达式比较长,可以按住【Alt】+【Enter】进行换行
ISBLANK(column) --判断该列中某个值是否为空 ISNONTEXT(column) --检查某个值是否不是文本 ISNUMBER(column) --检查某个值是否为数字 ISTEXT(column) --检查某个值是否为文本 ISLOGICAL(column) --检查某个值是否是逻辑值
11、文本函数
1、find
find(查找哪个字符,去哪里查找,从哪一个位置查找,如果找不到返回什么值) 第三个和第四个参数可以省略
示例:根据商品名称得出是上装还是下装
可以看到上装的商品种类多,而下装中包含“裙”或者“裤”的
裤 = find("裤",'商品表'[商品名称],1,100 ) 裙 = find("裙",'商品表'[商品名称],1,100) 下装或上装 = if (FIND("裤",'商品表'[商品名称],1,100) <> 100 || find("裙",'商品表'[商品名称],1,100) <> 100,"下装","上装")
2、search
search(查找哪个字符,去哪里查找,从哪一个位置查找,如果找不到返回什么值) 第三个和第四个参数可以省略
注意:find查找字符区分大小写,search不区分大小写,其它功能完全一样
示例:在商品表中根据商品名称获取是“上装”还是“下装”
3、left、right、mid
left从左向右取=left([字段名],取几个字符) right从右向左取=right([字段名],取几个字符) mid从中间开始取=mid([字段名],从第几个取,取几个) 字符长度= len([字段名])
示例:
前5位 = LEFT('身份证号'[身份证号],5 ) 后5位 = RIGHT('身份证号'[身份证号],5 ) 中间五位 = MID('身份证号'[身份证号],3,5 )
4、其他
REPLACE(),SUBSTITUTE() --字符串替换函数 TRIM(),LOWER(),UPPER()