在Excel Power Query中使用If,Like,Or和AND嵌套带Where子句的过滤器

时间:2018-10-29 06:10:07

标签: sql excel nested powerquery

我从事制造具有大量可追溯组件的设备的工作,并且我有一批理论上看起来像这样的数据:

Theoretical Data

我在Excel中有一些可互换的参数,例如:

SerialNumberP = GetParameter("SerialNumber"),
ProductCodeP = GetParameter("ProductCode"),
WorkOrderNumberP = GetParameter("WorkOrderNumber"),
PartCodeP = GetParameter("PartCode"),
BuildDateP = GetParameter("BuildDate"),

使用此方法,我成功完成了where子句,使用诸如此类的参数逐一搜索我的数据

  Where
   a.SerialNumber in ("& SerialNumberP &") 

但是,由于字段太多,有时提供给我们的信息会有所不同。因此,在带有标题的不同单元格中:

  • 序列号
  • 产品代码
  • 工作单
  • 零件代码
  • 零件批次

我想在可获得不同信息的不同情况下使用ANDOR子句。

例如:

  • 如果我想要一个特定的序列号和一个零件批号,或者
  • 如果我要使用特定的“零件批次”来处理整个工作订单
  • 如果我想查看所有使用此批次批处理的产品代码

到目前为止,我所拥有的与以下内容类似:

Where
          (a.SerialNumber in ("& SerialNumberP &")) 
    Or    (a.WorkOrderNumber in ("& WorkOrderNumberP &"))
    Or    (b.WorkOrderNumber in ("& WorkOrderNumberP &") _
                AND a.ComponentPartCode = '"& PartNumberP &"')
    Or    (a.ComponentPartCode = '"& PartNumberP &"' _
                AND a.SerialNumber in ("& SerialNumberP &"))
    Or    a.BatchNumber in ("& BatchNumberP &")

但是,众所周知,它是一个包含OR ,仅使用字段Part Batch就可以满足2个不同的OR条件,并且将输出两个他们。

我想问一下是否有一种方法可以使Excel单元格中的其他字段为空,仅能够查询有限的信息(例如序列号和部件号),并且仅输出相应的一行?

谢谢。

1 个答案:

答案 0 :(得分:0)

听起来您正在通过使用从Excel工作簿加载的参数在Power Query中设置动态SQL查询字符串?因为您正在用M代码设置查询字符串,所以可以有条件地创建字符串元素。我已经做了类似的事情,我想有多个要查询的字段,但可能想使用字段的任意组合来查看。我的解决方案是对每个字段使用AND包含,如果没有为该字段指定值,则根本不创建该行。我想这就是您要尝试的方法,尽管我不确定100%。

"SELECT * FROM yourtable " &

"WHERE a.SerialNumber <> NULL " & 

if SerialNumberP <> null then "AND a.SerialNumber IN ("& SerialNumberP &") " else "" &
if WorkOrderNumberP <> null then "AND a.WorkOrderNumber IN ("& WorkOrderNumberP &") " else "" &
if PartNumberP <> null then "AND a.ComponentPartCode IN ("& PartNumberP &") " else "" &
if BatchNumberP  <> null then "AND a.BatchNumber IN ("& BatchNumberP &") " else "" &

""