英文:
Why is query folding disabled in Power Query after adding a computed column using coalesce operator?
问题
在Power BI Desktop中,我从SQL Server表中提取了一些列,使用的是导入模式。在转换过程中,有2列,我想要基于它们创建第三个计算列,类似于SQL中的isnull(col1, col2) as 'col3'。但问题是在这一步失去了查询折叠。
我在我的Power Query中添加了一个自定义步骤,如下所示:
= Table.AddColumn(#"PreviousStep", "col3", each [col1] ?? [col2])
所有列都来自同一查询/表。我期望查询会折叠,但它并没有。请有人帮助我理解为什么?
请注意,我不能触摸源数据库,因此无法为自己创建任何视图。
英文:
In Power BI desktop, I pulled some columns off a SQL Server table in Import mode. During transformation, there are 2 columns using which I want to build a third computed column: something like isnull(col1,col2) as 'col3' if I had to write it in SQL. But problem is that query folding is lost at this step.
I added a custom step in my power query as follows:
= Table.AddColumn(#"PreviousStep", "col3", each [col1] ?? [col2])
All columns are from same query/table. I expected the query to fold, but it does not. Please could someone help me understand why?
Kindly note, that I can't touch the source database, hence can't create any views for myself.
答案1
得分: 1
为什么特定的 M 表达式会破坏折叠,我不知道。但您可以始终通过使用 原生查询折叠 和 Value.NativeQuery 来解决此问题。例如
let 
    Query = "select *, coalesce(OrderDate,ShipDate) ShipOrOrderDate from Sales.SalesOrderHeader", 
    Source = Sql.Database("office", "AdventureWorks2017"), 
    Data = Value.NativeQuery(Source, Query, null, [EnableFolding=true]),
    #"Filtered Rows" = Table.SelectRows(Data, each [TotalDue] > 472.3108) 
in 
    #"Filtered Rows"
Table.SelectRows 将被折叠成 SQL
select [_].[SalesOrderID],
    [_].[RevisionNumber],
    [_].[OrderDate],
    [_].[DueDate],
    [_].[ShipDate],
    [_].[Status],
    [_].[OnlineOrderFlag],
    [_].[SalesOrderNumber],
    [_].[PurchaseOrderNumber],
    [_].[AccountNumber],
    [_].[CustomerID],
    [_].[SalesPersonID],
    [_].[TerritoryID],
    [_].[BillToAddressID],
    [_].[ShipToAddressID],
    [_].[ShipMethodID],
    [_].[CreditCardID],
    [_].[CreditCardApprovalCode],
    [_].[CurrencyRateID],
    [_].[SubTotal],
    [_].[TaxAmt],
    [_].[Freight],
    [_].[TotalDue],
    [_].[Comment],
    [_].[rowguid],
    [_].[ModifiedDate],
    [_].[ShipOrOrderDate]
from 
(
    select *, coalesce(OrderDate,ShipDate) ShipOrOrderDate from Sales.SalesOrderHeader
) as [_]
where [_].[TotalDue] > 4.723108E+002
英文:
Why that particular M expression breaks folding, I don't know. But you can always work around this by using Native Query Folding with Value.NativeQuery. EG
let 
    Query = "select *, coalesce(OrderDate,ShipDate) ShipOrOrderDate from Sales.SalesOrderHeader", 
    Source = Sql.Database("office", "AdventureWorks2017"), 
    Data = Value.NativeQuery(Source,Query,null,[EnableFolding=true]),
    #"Filtered Rows" = Table.SelectRows(Data, each [TotalDue] > 472.3108) 
in 
    #"Filtered Rows"
The Table.SelectRows will be folded into SQL
select [_].[SalesOrderID],
    [_].[RevisionNumber],
    [_].[OrderDate],
    [_].[DueDate],
    [_].[ShipDate],
    [_].[Status],
    [_].[OnlineOrderFlag],
    [_].[SalesOrderNumber],
    [_].[PurchaseOrderNumber],
    [_].[AccountNumber],
    [_].[CustomerID],
    [_].[SalesPersonID],
    [_].[TerritoryID],
    [_].[BillToAddressID],
    [_].[ShipToAddressID],
    [_].[ShipMethodID],
    [_].[CreditCardID],
    [_].[CreditCardApprovalCode],
    [_].[CurrencyRateID],
    [_].[SubTotal],
    [_].[TaxAmt],
    [_].[Freight],
    [_].[TotalDue],
    [_].[Comment],
    [_].[rowguid],
    [_].[ModifiedDate],
    [_].[ShipOrOrderDate]
from 
(
    select *, coalesce(OrderDate,ShipDate) ShipOrOrderDate from Sales.SalesOrderHeader
) as [_]
where [_].[TotalDue] > 4.723108E+002
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论