使用动态标识符调用表

问题描述 投票:0回答:4

我正在尝试动态调用 Power Query M 中的表。我在下面创建了一个简单的查询来解释我想要做什么。

我希望结果是“It Worked”,而不是我目前得到的“Source1”。

let
  Source1 =  Table.FromList(
    {
      [Word1="It",Word2="Worked"]
    },
    Record.FieldValues,
    {"Word1","Word2"}
  ),
  Source2 = "Source" & "1"
in
  Source2

用例详细信息:

我正在尝试这样做,以便我可以根据条件调用查询。如:

if ENV = "production" then
  Customer_s
else
  Customer_m

其中

Customer_s
是检索在 CSV 文件中找到的客户数据的查询,
Customer_m
是检索在 SQL Server 上找到的客户数据的查询。

因为我将对许多表(不仅仅是客户)执行此操作,所以我想创建一个函数,您可以在其中传递模型名称(即“客户”),然后它将它串在一起以调用查询。

我只是发现 PowerBI 逐渐停止并不断地重新运行不必要的查询,这会降低我的 PC 和网络速度。我认为解决这个问题的一个简单方法是创建虚拟数据,该数据看起来像 SQL Server 的结果,但存储在我的计算机本地。这样,如果我无法访问互联网,我也可以编写查询。

powerbi powerquery m
4个回答
2
投票

#shared 包含所有可用查询和库函数的列表,因此您可以执行以下操作:

Record.Field(#shared, "It " & "Worked")


1
投票

如果你使用这个:

= Expression.Evaluate("Source"&"1", #shared)

您可以动态引用其他查询。但同一查询中的其他步骤则不然(看起来如此)。所以它必须放在一个新的查询中。

或者您的问题是:

 Text.Combine({"It", "Worked"}, " ")


0
投票

感谢@ImkeF提供的信息,我完成了这项工作。

我首先必须拆分两个查询,以便使用完整的

let
in
表达式对 Source1 进行评估,然后可以通过
#shared
进行访问。

查询 1

let
  Source1 =  Table.FromList(
    {
      [Word1="It",Word2="Worked"]
    },
    Record.FieldValues,
    {"Word1","Word2"}
  )
in
  Source1

查询2

let
    Source2 = Expression.Evaluate("Source"&"1", #shared)
in
    Source2

查询 2 的结果是:

╔═══════╦════════╗
║ Word1 ║ Word2  ║
╠═══════╬════════╣
║ It    ║ Worked ║
╚═══════╩════════╝

感谢@ImkeF 和@Alejandro 的帮助。


0
投票

我知道这是一个老问题,已经解决了,我是新手,但我有一个类似的解决方案 - 分享,以防有帮助/如果没有帮助,则获取反馈:-)

TLDR:通过将要引用的步骤封装在记录中来引用同一查询中的动态步骤集

用例:生成一个表,其中包含每个节点树的信息,其中树的深度是动态的。 具体来说,我的树是一个组织结构,其中每个节点都是一个组织单元。

备注:

  • 我仍然没有弄清楚如何在 M 中进行递归 - 但我只需要更少 超过 10 个级别,所以这里不是一个大问题......但是可能可以 递归更好
  • 据我了解,这是与公认的解决方案类似的解决方案 解决方案,因为
    let ... in
    表达式是 a 的语法糖 记录。使用记录结构允许访问每个元素而不是 不仅仅是
    in
  • 之后提到的步骤

代码:

Max_Level = ...
fx_Get_Level = ( Level as number , Prev_Level_Data as table ) as table => ...

Level_List = List.Transform( { 1 .. Max_Level } , each "L" & Text.From( _ ) ) ,
Levels = Record.SelectFields( 
    [ L1 = .. 
      , L2 = fx_Get_Level( 2 , L1 ) 
       ... 
      , L10 = fx_Get_Level( 10 , L9 ) 
      ] 
      , Level_List ) ,

TEST_Append = Table.Combine( Record.FieldValues( Levels ) ) ,
© www.soinside.com 2019 - 2024. All rights reserved.