300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > mysql 行号_PQ获取TABLE的单一值作为条件查询MySQL返回数据

mysql 行号_PQ获取TABLE的单一值作为条件查询MySQL返回数据

时间:2018-12-25 08:30:36

相关推荐

mysql 行号_PQ获取TABLE的单一值作为条件查询MySQL返回数据

下午,我正爽歪歪地喝着咖啡,看着Power BI每秒钟刷新一次,静静等待某个分公司完成本月绩效任务,自动调用Python在钉钉群中发送喜报:

紧接着再次调用Python将Power BI云端报告中的各分公司最新完成率数据和柱状图截图发在群里:

用的自然是下面这两篇文章的骚操作:

要说代码嘛,还是灰常简单滴:

当然,你可不要直接用啊,导入的库是本地生成的。详情请阅读以上两篇文章。

以上不是重点,说正事:

忽然,领导微信发来一张excel表,让我做一下简单分析,顺便发表一下看法。

领导安排活得赶紧的呀,放下咖啡,打开excel表-全选-插入表格-转换数据-powerquery

一顿操作猛如虎,分析了一下谁谁谁是二百五。

领导表示,说得对,就这么办。还有,把他上个月销售记录附在这张表后面,发我看看。

问题来了:这个时候如果是你,你会怎么完成这个任务?(前提,数据库中有所有人的全部记录。)

常规思路是,直接在数据库中查找这个人,按条件返回即可,只不过还得写一个导出到文件,然后打开文件复制到原来的表中,说实话还真有点繁琐。

PowerQuery能帮助我们很简便地解决这个问题。为简化模型,我们采用下面的数据来讲解:

比如我们要查询的人是moon,那么首先在powerquery编辑器中右键moon然后深化:

这样就得到了显示的值:moon。注意这里的值是一个单纯的值,而不是一个一行一列的表。当然,如果你关闭并上载,的确会得到一张一行一列的表:

由于我们并不想要这张表,而是想得到这个值,所以直接在这个查询后,将查询结果作为下一步查询的输入值。

得到了这个值,我们就可以调用MySQL去查询了:

let 源 = Excel.CurrentWorkbook(){[Name="表2"]}[Content], 更改的类型 = Table.TransformColumnTypes(源,{{"ID", Int64.Type}, {"NAME", type text}, {"销售额", Int64.Type}}), NAME = 更改的类型{1}[NAME], OUTPUT= MySQL.Database("localhost", "test1", [Query="select * from sheet1 WHERE销售员='"&NAME&"'"]) in OUTPUT

加载得到如下的返回表:

关闭并上载,保存文件,发送领导即可。

美滋滋,继续喝咖啡。

喝着喝着,我就开始琢磨这个查询了。

我按销售额从大到小的顺序排列,然后在查询结果表中点击右键刷新,发现:

诶?出问题了吧,一看查询到的结果,全都是infi的记录,这是怎么回事呢?

我们到查询编辑器中看看:

注意第三行:

NAME = 更改的类型{1}[NAME],

M语言允许我们通过坐标的方式获取表中单一的值,[NAME]代表NAME列,而{1}代表第2行,因为表都是从标号为0的行开始的。

而我们的原始表中,moon处于第2行:

而经过排序后的数据,第二行变成了infi:

因此,返回的查询一定也是infi的。

这样就有问题了,因为变动原始表,调整顺序,删除、增加行是经常会发生的事情,我不能每次去都修改moon所在的行吧?

主键的作用

我们知道,在关系型数据库SQL中,是存在主键的。那在Power Query中有没有可能设置主键呢?在UI上并没有设置的位置,但是我们还是可以想其他办法的,有这么几种方式:

1.从带有主键的数据库中导入数据

2.在pq中对table某一列去重,那么这一列就可以作为主键

3.使用Table.AddKey()函数对表操作

一旦设置主键,表中的每一个值就有了另外一种体现其坐标的方式。

我们对表的ID列进行去重(虽然其本身已经没有重复项,但这个操作必须得有),当做主键:

同样,选中moon右键-深化:

此时我们再来看看查询编辑器:

注意这个时候的第四行:

NAME = 删除的副本{[ID=3322]}[NAME]

它不再是以行号作为条件去匹配,而是以主键的名。而这种方式,对比用行号的方式,优势在于不论如何插入数据和改变排序,取值只看主键,所以查询结果不会变。我们测试一下:

不论怎么调整顺序,或者删除数据,只要表中还有moon,那么返回的结果都是不会变的。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。