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.Combine
和 Table.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
向上舍入