初学M语言(1)

1、导入excel数据并提升标题

在高级编辑器里面就是下面这样的代码:

let
    源 = Excel.Workbook(File.Contents("C:\桌面文件夹\每日数据.xlsx"), null, true),
    商务通情况表_Sheet = 源{[Item="商务通情况表",Kind="Sheet"]}[Data],
    提升的标题 = Table.PromoteHeaders(商务通情况表_Sheet, [PromoteAllScalars=true]),
    更改的类型 = Table.TransformColumnTypes(提升的标题,{{"是否预约", Int64.Type}, {"对话日期", type date}, {"时间", type datetime}, {"咨询员", type text}, {"是否有效", Int64.Type}, {"年龄", type any}, {"名称", type text}, {"IP", type text}, {"ip定位", type text}, {"操作系统", type text}, {"对话来源", type text}, {"访问来源", type text}, {"账户", type text}, {"初次访问网址", type text}, {"计划", type text}, {"单元", type text}, {"消费关键词", type text}, {"搜索词", type text}, {"客人讯息数", type text}, {"流失对话", Int64.Type}, {"转微信", Int64.Type}, {"另个患者预约号", type any}, {"对话时间", type datetime}, {"劫持", Int64.Type}, {"时段", Int64.Type}, {"Column26", type any}}),
    删除的列 = Table.RemoveColumns(更改的类型,{"Column26"}),
    更改的类型1 = Table.TransformColumnTypes(删除的列,{{"时间", type time}})
in
    更改的类型1

“let”后面的语句都是操作,“in”后面是输出(相当于python的print语句),“=”前面是一个操作的名称(相当于变量),后面是操作具体内容(赋值)。
就这个例子,“源”这一步就是获取数据,“源”是一个步骤名称(其实可以改其他名字)。
“in”这一步,如果不in更改的类型1,in提升的标题的话,就只会输出提升的标题那一步的操作,后面的都没影响。
注意:in前面的更改的类型1,这一步操作是没有逗号的,其他的操作都有。

2、选择列,并重命名

选择一列

let
    源1 = Table.SelectColumns(某个查询,"对话时间"),
    重命名的列 = Table.RenameColumns(源1,{{"对话时间", "时间"}})
in
    重命名的列

选择多列:

let
    源 = Table.SelectColumns(某个查询,{"咨询员","性别"})
in
    源

3、追加

追加查询就是将两个数据往上下拼接

let
    源 = Table.SelectColumns(查询1,"时间"),
    追加 = Table.Combine({源,查询2})
in
    追加

4、合并

let
    源 = Table.SelectColumns(预约明细,{"咨询员","性别"}),
    合并的查询 = Table.NestedJoin(源,{"咨询员"},查询7,{"咨询员"},"新列名",JoinKind.Inner)
in
    合并的查询

关于 #:
你可能会问,这个 #是什么东西?
在 PQ 中,某些数据类型、结构、符号等之前需要加 #,比如 #date,#table,#(lf),#shared 等。看到这你可能要晕了,好好的搞这么复杂干嘛?
试想下要表示 2017/6/1 这个日期,如果不加 #,写成 = date(2017,6,1),那么 PQ 会以为 date 是一个自定义函数,结果找不到这个函数的表达式,就会报错,所以得加上 #声明这是一个日期,而不是其他。
另一种情况用于查询、步骤以及列等等的命名,查询名、步骤名和列名不得以数字开头,不能出现特殊符号,比如可以叫 "查询 1" 但是不能叫 "1 查询",也不能叫 "查询 1-"。你如果非要这么做,也是可以的,但是必须得加上 #,写成 #"1 查询",声明命名中允许数字开头及特殊符号。

5、学会查看帮助:

在 PQ 中输入 #shared 或函数名可查看帮助说明,见《M 语言参考资料》。
M 中的函数都是 . 的格式,每个单词首字母大写。点之前表示函数类别,点之后表示函数功能,比如 Text.CombineTable.Combine,虽然功能都是合并,但是作用的对象类型不一样。
在帮助说明中,给出了该函数说明、参数及案例等,这里需要注意:

function 表示该函数,需要两个参数 (texts 和 separator),其中 texts 为必需参数,类型为 list;separator 为 optional,即可选参数,可以省略,类型为 text,nullable 代表可以为空值 null;最后返回的结果为 text。
每一个参数必须严格按照指定类型,否则就会报错。比如 = Text.Combine("NO.","1"),而第一参数要求的类型是 list,就需要在两个文本外面加一对 {} 构成 list。

6、if语句写法

= Table.AddColumn(更改的类型1,"自定义排序",(x)=>if x[子产品类别] ="其他" then 2 else 1)
= Table.AddColumn(更改的类型1,"自定义排序",each if _[子产品类别] ="其他" then 2 else 1)

7、参数


参数的引用


8、函数的循环

let
    get_data =(x)=>
    let 
        Source = OleDb.Query(#"URL&Database"{0}&x, 
        "SELECT #(lf)    DIMENSION_NAME AS TABLE_NAME, #(lf)#(tab)TABLE_ID AS TABLE_ID,#(lf)    ROWS_COUNT AS ROWS_IN_TABLE#(lf)FROM  $SYSTEM.DISCOVER_STORAGE_TABLES#(lf)WHERE RIGHT ( LEFT ( TABLE_ID, 2 ), 1 ) <> '$'#(lf)ORDER BY DIMENSION_NAME"),
        #"Renamed Columns" = Table.RenameColumns(Source, {{"TABLE_NAME", "TABLE_NAME"}, {"ROWS_IN_TABLE", "ROWS_IN_TABLE"}, {"TABLE_ID", "TABLE_ID"}}),
        #"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns", {{"TABLE_NAME", type text}, {"ROWS_IN_TABLE", Int64.Type}, {"TABLE_ID", type text}}),
        addcolumn = Table.AddColumn(#"Changed Type", "Datatable", each x)
    in
        addcolumn,
    D= AnalysisServices.Databases(#"AS URL"),
    result=Table.Combine(List.Transform(D[Name],get_data))
in
    result

9、构造表

= Table.FromRows({ {1, "Bob", "123-4567"},{2, "Jim", "987-6543"}},{"DATABASE_NAME", "OBJECT", "TABLE"})

10、捕获错误

a=Table.ToRecords(s),
aa=try a{0},
aaa=aa[HasError],

全文

let
    get_data =(x)=>
      let 
        cubename=if #"All_Or_Single" ="all" then x else  #"All_Or_Single",
        s=AnalysisServices.Database(#"Server URL",cubename, 
        [Query="select * from $SYSTEM.DISCOVER_CALC_DEPENDENCY", Implementation="2.0"]),
        a=Table.ToRecords(s),
        aa=try a{0},
        aaa=aa[HasError],
        blank_table=Table.FromRows({ {null,null,null,null,null,null,null,null,null,null}},{"DATABASE_NAME", "OBJECT_TYPE", "TABLE","OBJECT","EXPRESSION","REFERENCED_OBJECT_TYPE","REFERENCED_TABLE","REFERENCED_OBJECT","REFERENCED_EXPRESSION","QUERY"}),
        distinct = Table.Distinct(s, {"TABLE"}),
        xx=if aaa then blank_table else s
      in 
        xx,
    D= AnalysisServices.Databases(#"Server URL"),
    result=Table.Combine(List.Transform(if #"All_Or_Single" ="all" then D[Name] else  {#"All_Or_Single"},get_data)),
    筛选的行 = Table.SelectRows(result, each ([REFERENCED_OBJECT_TYPE] = "CALC_COLUMN" or [REFERENCED_OBJECT_TYPE] = "COLUMN")),
    删除的其他列 = Table.SelectColumns(筛选的行,{"DATABASE_NAME", "REFERENCED_TABLE", "REFERENCED_OBJECT"}),
    已添加自定义 = Table.AddColumn(删除的其他列, "自定义", each [DATABASE_NAME]&[REFERENCED_TABLE]&[REFERENCED_OBJECT]),
    删除的副本 = Table.Distinct(已添加自定义, {"自定义"}),
    删除的列 = Table.RemoveColumns(删除的副本,{"自定义"}),
    已添加自定义1 = Table.AddColumn(删除的列, "Cube_Table_Name", each [DATABASE_NAME]&"_"&[REFERENCED_TABLE]),
    已添加自定义2 = Table.AddColumn(已添加自定义1, "Num1", each 1),
    重命名的列 = Table.RenameColumns(已添加自定义2,{{"REFERENCED_OBJECT", "Column"}, {"REFERENCED_TABLE", "Table"}, {"DATABASE_NAME", "Cube"}}),
    更改的类型 = Table.TransformColumnTypes(重命名的列,{{"Num1", Int64.Type}})
in
    更改的类型

11、列乘以一个系数

单列

let
    源 = Excel.Workbook(File.Contents("C:\Users\L\Desktop\工作簿1.xlsx"), null, true),
    Sheet1_Sheet = 源{[Item="Sheet1",Kind="Sheet"]}[Data],
    提升的标题 = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars=true]),
    更改的类型 = Table.TransformColumnTypes(提升的标题,{{"name", type text}, {"date", type date}, {"sell", Int64.Type}}),
    重命名的列 = Table.RenameColumns(更改的类型,{{"date", "date122"}}),
    fx = (x)=>x+1,
    向上舍入 = Table.TransformColumns(重命名的列,{{"sell", fx}})
in
    向上舍入

多列

let
    源 = Excel.Workbook(File.Contents("C:\Users\L\Desktop\工作簿1.xlsx"), null, true),
    Sheet1_Sheet = 源{[Item="Sheet1",Kind="Sheet"]}[Data],
    提升的标题 = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars=true]),
    更改的类型 = Table.TransformColumnTypes(提升的标题,{{"name", type text}, {"date", type date}, {"sell", Int64.Type}}),
    重命名的列 = Table.RenameColumns(更改的类型,{{"date", "date122"}}),
    fx = (x)=>x+10,
    
    复制的列 = Table.DuplicateColumn(重命名的列, "sell", "sell1"),
    向上舍入 = Table.TransformColumns(复制的列,{{"sell",fx},{"sell1",fx}})
in
    向上舍入

你可能感兴趣的:(初学M语言(1))