[已解决] excel中power query动态筛选条件筛选行,出现无法将值...转换...

  [复制链接]
查看158536 | 回复143 | 2020-9-16 05:49:34 | 显示全部楼层 |阅读模式
我需要对“设备运行记录”表进行筛选 9895012147541.png
RQ代表日期,JH代表设备编号,RCYL代表设备运行记录。
需要筛选的是:不同设备所对应不同时间段的设备记录
9895012147542.png
我做了一个表“需筛选设备及其运行时间段”
9895012147543.png
将这个表通过“从表格”的方式进入查询编辑器
查询命名为:所有设备筛选条件
新建列“筛选条件”,自定义列公式为:
=if [结束运行时间]=null
then "([JH]="""&[设备]&""""&" and [RQ]>=#date("&Text.From(Date.Year([开始运行时间]))&","&Text.From(Date.Month([开始运行时间]))&","&Text.From(Date.Day([开始运行时间]))&"))"
else "([JH]="""&[设备]&""""&" and [RQ]>=#date("&Text.From(Date.Year([开始运行时间]))&","&Text.From(Date.Month([开始运行时间]))&","&Text.From(Date.Day([开始运行时间]))&")"&" and "&"[RQ]=#date(2018,9,15))
9895012147544.png
通过在高级编辑器里添加语句:分组的行 = Table.Group(已添加自定义, {}, {{"条件", each Text.Combine([筛选条件]," or ")}}),
使用Text.Combine将所有设备所对应的筛选条件用“ or ”连接起来,形成类似:([JH]="DX02-06C" and [RQ]>=#date(2018,9,15)) or ([JH]="DX03-01C" and [RQ]>=#date(2018,9,15)) or ...的筛选条件(因为我的excel用不了textjoin()函数,所以使用了这个方法)
列重命名为:所有设备筛选条件
9895012147545.png
然后将“设备运行记录”通过“从表格”的方式进入查询编辑器
9895012147546.png
通过在高级编辑器里添加语句:筛选的行 = Table.SelectRows(更改的类型, each 所有设备筛选条件{0}[所有设备筛选条件])
出现错误:
Expression.Error: 无法将值 "([JH]="DX02-06C" and..." 转换为类型 Logical。
详细信息:
  Value=http://club.excelhome.net/([JH]="DX02-06C" and [RQ]>=#date(2018,9,15)) or ([JH]="DX03-01C" and [RQ]>=#date(2018,9,15)) or ([JH]="DX03-03C" and [RQ]>=#date(2018,9,15)) or ([JH]="DX03-04" and [RQ]>=#date(2017,12,14)) or ([JH]="DX03-06"
无法实现筛选。

9895012147547.png

而通过直接将在查询“所有设备筛选条件”组合形成的筛选条件:([JH]="DX02-06C" and [RQ]>=#date(2018,9,15)) or ([JH]="DX03-01C" and [RQ]>=#date(2018,9,15)) or ([JH]="DX03-03C" and [RQ]>=#date(2018,9,15)) or ([JH]="DX03-04" and [RQ]>=#date(2017,12,14)) or...
复制到:筛选的行 = Table.SelectRows(更改的类型, each (....))语句中,可以实现筛选。

因为需要筛选的设备及其所对应的运行时间段,根据不同需要会发生变化,我想要通过仅更改“需筛选设备及其运行时间段”工作表里的设备和运行时间段,然后使用“数据”标签页里的刷新来实现“设备运行记录”的筛选,以便进行后续的数据分析工作。
我遇到的问题是
查询“所有设备筛选条件”里组合的筛选条件,通过:筛选的行 = Table.SelectRows(更改的类型, each 所有设备筛选条件{0}[所有设备筛选条件])语句不能实现筛选功能,我在网上查了好多资料,没有找到这个问题的解答,我刚学习power query没多久,一直在不断摸索中,问题描述中如有问题,请勿见笑,还望论坛大神不吝赐教,多谢。
9895012147548.zip (100.31 KB, 下载次数: 0)
回复

使用道具 举报

koppera | 2020-9-16 05:57:34 | 显示全部楼层
上传示例数据,模拟想要的结果
回复

使用道具 举报

linda_981 | 2020-9-16 06:02:35 | 显示全部楼层
上传示例数据,模拟想要的结果


谢谢提醒,附件已上传
回复

使用道具 举报

彬仔 | 2020-9-16 06:06:35 | 显示全部楼层
效率不是太好,但是想不出更好的了
  1. let

  2.   Source = Table.TransformColumnTypes(Excel.CurrentWorkbook(){[Name="表1"]}[Content],{"RQ",type date}),

  3.   ctrn = Table.TransformColumnTypes(Excel.CurrentWorkbook(){[Name="表9"]}[Content],{{"开始运行时间",type date},{"结束运行时间",type date}}),

  4.   Custom1 = Table.ReplaceValue(Table.NestedJoin(Source,"JH",ctrn,"设备","n",JoinKind.LeftOuter),each [RQ],null,(x,y,z)=>Table.RowCount(Table.SelectRows(x,(m)=> m[开始运行时间]=y))),{"n"}),

  5.   Custom2 = Table.SelectRows(Custom1, each [n]>0),

  6.   #"Removed Columns" = Table.RemoveColumns(Custom2,{"n"})

  7. in

  8.   #"Removed Columns"
复制代码



9895012147549.zip (109.24 KB, 下载次数: 0)
回复

使用道具 举报

mmgmmg2 | 2020-9-16 06:12:35 | 显示全部楼层
通过合并查询实现,学习到了,非常感谢,
另外custom1语句不太理解,Table.ReplaceValue函数是否是将each [RQ]赋值给y,n列每一个表赋值给了x,null赋值给了z,each [RQ]和null只是传递参数,用意并不是用作函数的old value和new value,通过“(x,y,z)=>Table.RowCount(Table.SelectRows(x,(m)=> m[开始运行时间]=y))”,给n列赋值。n列每一行的表为空表,或者RQ不符合if语句条件,返回空表,行计数为0,n赋值为0;RQ符合if语句条件,返回只有一行有内容的表,行计数为1,n赋值为1。
刚开始学习,不知道理解的对不对
回复

使用道具 举报

qqwwqqww | 2021-6-14 09:07:02 | 显示全部楼层
非常好,顶一下
回复

使用道具 举报

oceanw | 2021-6-29 20:43:29 来自手机 | 显示全部楼层
为了三千积分!
回复

使用道具 举报

乱熊 | 2021-9-16 09:09:48 来自手机 | 显示全部楼层
前排顶,很好!
回复

使用道具 举报

LOVE | 2021-10-19 22:31:46 来自手机 | 显示全部楼层
纯粹路过,没任何兴趣,仅仅是看在老用户份上回复一下
回复

使用道具 举报

慕蓉秋月 | 2021-11-1 20:55:00 来自手机 | 显示全部楼层
LZ是天才,坚定完毕
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则