数据类型:
在excel中,我们经常使用如="NO."&1
得到"NO.1",但是如果在PQ中这么操作,就会发现报错了。这是因为PQ对数据类型非常严格,数字就是数字,文本就是文本,数字和文本不能放一起运算。
在PQ中数据类型比较多,如下:
类型 | 举例 |
---|---|
Null | null |
Logical | true false |
Number | 0 1 -1 1.5 2.3e-5 |
Time | #time(09,15,00) |
Date | #date(2017,06,30) |
DateTime | #datetime(2017,06,30,09,15,00) |
DateTimeZone | #datetimezone(2017,06,30,09,15,00,09,00) |
Duration | #duration(0,1,30,0) |
Text | "hello" |
Binary | #binary("AQID") |
List | {1,2,3} |
Record | [A=1,B=2] |
Table | #table({"X","Y"},{{0,1},{1,0}}) |
Function | (x)=>x+1 |
Type | type {number} type table [A=any,B=text] |
如果需要对数据类型转换,则需要用到转换函数,如要得到"NO.1",需要
= "NO."&Text.From(1)
。再比如,日期是2017/6/1,要往后推3天,如果直接+3肯定是错的。因为日期是date类型,3是number类型,不同的类型不能放在一起运算,需要
= Date.AddDays(#date(2017,6,1),3)
。然而有时候类型不同也是可以运算的,比如
= #date(2017,6,1)+#duration(3,0,0,0)
,等价于前面的公式,虽然一个是date类型,一个是duration类型,但都是属于日期时间类的,所以可以这么做。
关于#:
你可能会问,这个#是什么东西?
在PQ中,某些数据类型、结构、符号等之前需要加#,比如#date,#table,#(lf),#shared等。看到这你可能要晕了,好好的搞这么复杂干嘛?
试想下要表示2017/6/1这个日期,如果不加#,写成= date(2017,6,1)
,那么PQ会以为date是一个自定义函数,结果找不到这个函数的表达式,就会报错,所以得加上#声明这是一个日期,而不是其他。
另一种情况用于查询、步骤以及列等等的命名,查询名、步骤名和列名不得以数字开头,不能出现特殊符号,比如可以叫"查询1"但是不能叫"1查询",也不能叫"查询1-"。你如果非要这么做,也是可以的,但是必须得加上#,写成#"1查询",声明命名中允许数字开头及特殊符号。
学会查看帮助:
在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。
认真拜读大作,可谓逐字逐句。发现本文倒数第二段的最后一句话,“最后返回的结果为list”,是不是作者笔误?按照我理解,这句话是不是应该为“最后返回的结果为text”?
是的,已更正
#binary("AQID") 中AQID是个啥意思?
随便构建的一个二进制数据,没什么特别的意思
#转义符的意思吧!
符合汉语习惯的表述,容易理解,大赞,学习Power Query好资料,强烈推荐
楼主辛苦,太牛掰了
开始认真学习pq和m函数,谢谢老师不吝指教
2020-10-17
施老师,请教一下,为什么在PQ里设置列的数据格式为货币、小数、文本等等之后,再上载到excel形成表之后,
这几列并没有按PQ里修改好的格式来呈现,而都是“常规”单元格格式呢?
只有日期格式,我发现在PQ里改好后,输出到excel表里就是ok的日期格式。
这样岂不是PQ的数据清洗很大程度就没有意义了呢?
老师辛苦,太牛掰了
找到了这个好地方,才开始学习~~感谢老师的付出
optional separator要怎么理解呢