如何在电源查询中执行COALESCE?

时间:2015-07-14 11:17:22

标签: excel powerquery

我有一个包含四分之一值的表,我需要添加一个新列,它给出了上一季度的最后一个非空值。例如

ID | Project  | Q1   | Q2   | Q3   | Q4   | Current Quarter Value  
1  | bal bal  | 23   | 32   | 34   | null | 34  
2  | cuz cuz  | 43   | 56   | null | null | 56  

5 个答案:

答案 0 :(得分:11)

在向表中添加自定义列时可以使用几个公式(可从“变换”功能区选项卡访问)。这是一个:

if [Q4] <> null then [Q4] else if [Q3] <> null then [Q3] else if [Q2] <> null then [Q2] else [Q1]

如果您不想编写这么多if语句,可以将列添加到列表中并过滤掉空值:

List.Last(List.Select({[Q1], [Q2], [Q3], [Q4]}, each _ <> null))

答案 1 :(得分:0)

我认为有点晚了,但是我也在寻找比以下更好的解决方案: List.First(List.RemoveNulls({list}))

或默认值:

List.First(List.RemoveNulls(List.Combine {{list},{defaultValue}}})))

答案 2 :(得分:0)

您可以尝试空合并运算符(??)。除非它为null,否则以下两行都达到返回ValueA的相同效果,在这种情况下,返回ValueB

if ValueA <> null then ValueA else ValueB
ValueA ?? ValueB

根据您的具体情况,必要的代码将为:

[Q4] ?? [Q3] ?? [Q2] ?? [Q1]

请注意,空合并运算符是Power Query的new addition。该文件尚未正式记录,可能not在所有环境中都可用。

信息取自this blog post

答案 3 :(得分:0)

使用 List.RemoveNulls 让我感到困扰,因为它似乎做了多余的工作。

这是一个似乎避免处理整个列表的函数,超出第一个非空项目:

coalesce = each List.First(List.RemoveFirstN(_, each _ = null), null)

答案 4 :(得分:-3)

要找到非空的单行范围的最右边的值,您有两个方法

  1. 如果您知道中间没有空白值,则计算所有非空白并使用此值偏移范围原点

    =OFFSET(C2,0,COUNTA(C2:F2)-1)
    
  2. enter image description here

    1. 如果可能存在散布的空值,则在给定范围内使用查找以修改所有非空白,并再次使用给定范围作为结果范围

      =LOOKUP(2,1/(C2:F2<>""),C2:F2)
      
    2. enter image description here