M语言（PowerQuery）指令

1. 变更某列里面的数据，比如将TEXT型的日期+时间数据切成日期数据
    ```
    FunctionName = Table.TransformColumns(Sorce, {"变的更列名", each Text.Start(_,     10)}),
    ```



1. 添加新的列
    ```
    FunctionName = Table.AddColumn(Source, "新的列名", each [已有的列名] * 2, type number)
    ``` 

    
1. 用于将某列里面的8位字符型日期转换成yyyy/MM/dd格式
    ```
    FunctionName = Table.AddColumn(Source, "新的列名", each Text.Middle([yyyymm的年月列], 1, 4) & "/" & Text.Middle([yyyymm的年月列], 5, 2) & "/01", type text),
    ```

    置换值，将某（几）列的值置换成另外的值，如，将null置换成0
    ```
    置换值= Table.ReplaceValue(Source, null, 0, Replacer.ReplaceValue, {"置换列的名字"}),
    ```
    
    其中`null`是被置换的值，`0`是置换值
    也可以像下面这样，同时置换若干列  
    ```
    置换值 = Table.ReplaceValue(Source, null, 0, Replacer.ReplaceValue, {"置换列的名字1", "置换列的名字2", "置换列的名字3"})
    ```


1. 将日期列里的年向后推一年
    ```
    置换列 = Table.TransformColumns(Source, {{"日期列", each DateTime.ToText(Date.AddYears(DateTime.FromText(_), 1), "yyyy-MM-ddTHH:mm:ss")}}),
    ```


1. 表连接，将两个表连接在一起，相当于SQL的`LEFT JOIN`，`INNER JOIN`
    ```
    表连接 = Table.NestedJoin(表1的名字, {"表1的链接键1", "表1的链接键2"}, 表2的名字, {"表2的链接键1", "表2的链接键2"}, "连接之后新的列名", JoinKind.LeftOuter),
    ```


1. 删除重复数据（获取唯一值）
    ```
    重複削除 = Table.Distinct(Source, {"去重的列名1", "去重的列名2"})
    ```


1. 表展开，将连接在一起的表展开，一般`Source`是`"表连接"`
    ```
    Expand_FROM = Table.ExpandTableColumn(Source, "连接之后新的列名", {"需要展开的列1", "需要展开的列2", "需要展开的列3"}, {"将需要展开的列展开之后的名字1", "将需要展开的列展开之后的名字2", "将需要展开的列展开之后的名字3"}),
    ```

    
1. M使用if根据条件向列输出组合值。下面的示例，在表中增加一列，这列的值如果是条件1，则输出then后面的组合，如果不符合条件1，则输出else后面的组合
    ```
    如何使用if = Table.AddColumn(Source, "新增列名", each 
      if Text.From(Date.Year([日期的列名])) = "2022" then "二零二二" & [组合值的列名] 
      else if Date.Year([日期的列名]) = Date.Year(DateTime.LocalNow()) then "今年" & [组合值的列名] 
      else Text.From(Date.Year([日期的列名])) & [组合值的列名]
    ,type text)
    ```

8. 在if条件里面写函数的方法
    ```
    重置值 = Table.AddColumn(Source, "新列名", each 
    if [条件列1] = "条件1" or [条件列2] = "条件3" then
      let
        随机数 = Number.Mod(Number.RoundDown(DateTime.LocalNow() * 1000) , List.Count(数组1)),
        数组下标 = Number.RoundDown(Number.RandomBetween(0, List.Count(数组1)))
      in
        数组1{数组下标}

    else 
      let
        随机数 = Number.Mod(Number.RoundDown(DateTime.LocalNow() * 1000) , List.Count(o数组2)),
        数组下标 = Number.RoundDown(Number.RandomBetween(0, List.Count(数组2)))
      in
        数组2{数组下标}
    , type text )
    ```

1. 利用if里面写函数的方法，建立新列，并根据条件随机填入数据
    ```
      数据列1 = {"A", "B", "C", "D"},
      数据列2 = {"AA", "BB", "CC", "DD"},
      数据列3 = {"AAA", "BBB", "CCC", "DDD"}  
      根据条件赋值列 = Table.AddColumn(Source, "新列名", each 
      if [条件列1] = "条件1" or [条件列1] = "条件2" then
        let
          重置随机值 = Number.Mod(Number.RoundDown(DateTime.LocalNow() * 1000) , List.Count(数据列1)),
          取值 = Number.RoundDown(Number.RandomBetween(0, List.Count(数据列1)))
        in
          数据列1{取值}

      else if [数据列1] = "条件1" and [数据列2] = "条件2" then
        let
          重置随机值 = Number.Mod(Number.RoundDown(DateTime.LocalNow() * 1000) , List.Count(数据列2)),
          取值 = Number.RoundDown(Number.RandomBetween(0, List.Count(数据列2)))
        in
          数据列2{取值}, type text
    
      else 
        let
          重置随机值 = Number.Mod(Number.RoundDown(DateTime.LocalNow() * 1000) , List.Count(数据列3)),
          取值 = Number.RoundDown(Number.RandomBetween(0, List.Count(数据列2)))
        in
          数据列3{取值}, type text
    )
    ```

1. 过滤掉非数字型的值
    ```
    过滤值 = Table.SelectRows(Source, each Value.Is(Value.FromText([目标列]), type number)),
    ```



1. 多个if条件一起判断
    ```
    if List.Contains({"条件1","条件2","条件3"}, [目标列]) then "值1"
        else if List.Contains({"条件4","条件5","条件6"}, [D目标列]) then "值2"
        else null
    ```