Power BI 系列 - M语言 -1 高级过滤数据

Power BIower BI导入模型中用户通过"编辑查询" 可以指定数据库连接及加载 数据导入.

 

举例来说,有一张电子表格 有各每一天的历史记录,  用户同时需要查看每一天的表格,以及当月最后一天的数据.

黄色部就是每月后一天的,

解决方案: 可以编辑查询处理.也可以通DAX处理.  重点说一下M语言

 

 

 

 

 

 

步聚如下:

1.打开POWER BI打开数据设计

 

 

 

2.编辑,进入PowerQuery  即查询编辑器,点编辑,我们一起看查询编辑 怎么样

 

 

 

 

 

 数据导入进来,通过高级编辑器,看下一下如何加载数据的

 

 

 

 

 

 

  

红色 框框就是M语言的语法.   除了最后一个步聚不要后面要加 ","  

let 

   步聚名1=xxxxxx ,

   步聚名1=xxxx 

in 
   步聚名1

 

下面这段的话的意思就是       源 ( 是个变量)  =  来自电子表格  ,  取itme =sheet1 工作薄, 第一行作为标题, 并且更改数据类型,并简单过滤为空的

let
    源 = Excel.Workbook(File.Contents("D:\Demo\PowerBI\4-1M语言.xlsx"), null, true),
    Sheet1_Sheet = 源{[Item="Sheet1",Kind="Sheet"]}[Data],
    提升的标题 = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars=true]),
    更改的类型 = Table.TransformColumnTypes(提升的标题,{{"日期", type date}, {"物料", type text}, {"库存地", type text}, {"数量", Int64.Type}}),
    筛选的行 = Table.SelectRows(更改的类型, each ([日期] <> null))
in
    筛选的行

 每个步聚名和右边应用步聚是一样.  (Power BIower BI可以保存加载记录,  说白了,就是把每一步操作记录下来.  每一步的源,能传递下来. 当然有些步聚可以暂时保存下来,相当于临时表, 下一步可能使前几天步的源也可以

  

 

 

 

 

 

 

这时候还需要每个月最后一天数据,  有人会想到用group by 每一行进行分组,对度量值求最大值.    但是这不是很好的方法,因为字段太多就要区分哪些可以分组,哪些是度量值.

 

一种开销少的方案如下

 

 

 

开始

1.新建一个空白查询

 

 

 

2选择高级编辑器 查询如下, 其含义引用 sheet 的数据集到源 . 直接就复用数据源

let
    源 = Sheet1
in
    源

3.派生一列月份  

let
    源 = Sheet1,
    复制的列 = Table.AddColumn(源,"月", each Date.ToText([日期],"yyyy-MM"))   
in
    复制的列

4.按月份分组 

let
    源 = Sheet1,
     复制的列 = Table.AddColumn(源,"", each Date.ToText([日期],"yyyy-MM"))   ,
     分组的行 = Table.Group(复制的列, {"月"}, {{"月最后一天", each List.Max([日期]), type date}})
in
分组的行

4.按月份分组   Table.NetstedJoin 的含义   .

  Inner join关联 ( 表名A, 表 A关联字段,   表B,表B关联的字段,    表B的别名, 关联类型内联接)

let
    源 = Sheet1,
    复制的列 = Table.AddColumn(源,"月", each Date.ToText([日期],"yyyy-MM"))   ,
     分组的行 = Table.Group(复制的列, "月", {{"月最后一天", each List.Max([日期]), type date}}),
     合并的查询 = Table.NestedJoin(源 , {"日期"}, 分组的行, {"月最后一天"}, "随便取个名", JoinKind.Inner)
in
    合并的查询

5. 不需要表B的字段 

let
    源 = Sheet1,
    复制的列 = Table.AddColumn(源,"月", each Date.ToText([日期],"yyyy-MM"))   ,
     分组的行 = Table.Group(复制的列, "月", {{"月最后一天", each List.Max([日期]), type date}}),
     合并的查询 = Table.NestedJoin(源 , {"日期"}, 分组的行, {"月最后一天"}, "随便取个名", JoinKind.Inner),
    删除的列 = Table.RemoveColumns(合并的查询,{"随便取个名"})
in
    删除的列 

最后结果

 

代码下载 https://github.com/zengxinwen/PowerBI

posted @ 2019-09-09 22:29  曾新文  阅读(1385)  评论(0编辑  收藏  举报