【问题标题】:Power BI: Custom column for client and yearPower BI:客户和年份的自定义列
【发布时间】:2018-05-23 07:55:07
【问题描述】:

我想在查询编辑器 (QE) 中创建一个表格,显示我的客户编号、年份、金额和一个自定义列,指示过去 3 年的金额是否为空。

我尝试了多种解决方案,但似乎都没有奏效。我在查询编辑器中需要这个。我不能为此使用度量值。

有人可以帮我解决这个问题吗?如果你们中的任何人需要额外的信息,请告诉我,我会看看我能做些什么。

例如我的结果应该是什么: Clientnumber Year Amount Custom table 1 2016 2100 FALSE 1 2017 2000 FALSE 1 2018 100 TRUE
2 2016 0 FALSE 2 2017 100 FALSE 2 2018 3800 FALSE 2 2019 2357 TRUE

我希望这个例子有点帮助!

【问题讨论】:

  • 输入和所需输出的示例将有很大帮助。请参阅mcve
  • 亲爱的 Alexis Olson 我已经添加了一个我正在寻找的示例

标签: statistics analytics powerbi powerquery


【解决方案1】:

好的,我想到了一种完全不同的方法,它对 PQ 更有意义,即使它看起来有点奇怪。我认为这应该运行得更快。

制作几个具有年份 - 1 和年份 - 2 的自定义列,以获取您过去两年的信息。现在使用 Merge Queries 函数,并将表与自身合并。 Cntrl-选择客户,然后在顶部表格中为 Year - 1 制作的列,然后 Cntrl-选择客户,然后在底部表格中选择当前年份的列。从结果中展开金额,但将其命名为上一年金额或其他名称。对 Year -2 列执行相同操作。

然后只需添加一个自定义列,用于检查三年金额中的 0 或空值,您就会得到答案。

这是最终表格的样子和完整的 M 代码(显然,您可以在完成后删除带有前一年/amt 引用的列)。

let
    Source = Table1,
    #"Merged Queries" = Table.NestedJoin(Source,{"Client", "Year"},Source,{"Client", "Year"},"Source",JoinKind.LeftOuter),
    #"Removed Columns" = Table.RemoveColumns(#"Merged Queries",{"Source"}),
    #"Added Custom" = Table.AddColumn(#"Removed Columns", "PY", each [Year]-1),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "PPY", each [Year]-2),
    #"Merged Queries1" = Table.NestedJoin(#"Added Custom1",{"Client", "PY"},#"Added Custom1",{"Client", "Year"},"Added Custom1",JoinKind.LeftOuter),
    #"Expanded Added Custom1" = Table.ExpandTableColumn(#"Merged Queries1", "Added Custom1", {"Amt"}, {"PY.Amt"}),
    #"Merged Queries2" = Table.NestedJoin(#"Expanded Added Custom1",{"Client", "PPY"},#"Expanded Added Custom1",{"Client", "Year"},"Expanded Added Custom1",JoinKind.LeftOuter),
    #"Expanded Expanded Added Custom1" = Table.ExpandTableColumn(#"Merged Queries2", "Expanded Added Custom1", {"Amt"}, {"PPY.Amt"}),
    #"Added Custom2" = Table.AddColumn(#"Expanded Expanded Added Custom1", "ThreeYearCheck", each not List.ContainsAny({[Amt],[PY.Amt],[PPY.Amt]}, {null, 0})),
    #"Sorted Rows" = Table.Sort(#"Added Custom2",{{"Client", Order.Ascending}, {"Year", Order.Ascending}})
in
    #"Sorted Rows"

【讨论】:

  • 工作就像一个魅力。太奇怪了,我自己找不到这个!但无论如何谢谢:)
【解决方案2】:

花了一分钟时间来理解您的意思,但我假设您正在寻找您正在查看的记录年份以及前两年每年的金额。

我还在假设这些数据已经汇总,因此每个客户每年只有一个金额(如果还没有的话,您可以在 PQ 中轻松汇总)。

我不知道这是否是“正确”的方法,但我基本上只是在做一个 countifs 函数。添加一个自定义列并将其放入其中(我假设您提供的示例作为没有自定义列的起点,因此引用“Source”作为查询的第一步):

let CurClient = _[Clientnumber], CurYear = _[Year] in Table.RowCount(Table.SelectRows(Source, each [Clientnumber] = CurClient and [Year] >= CurYear-2 and [Year] <= CurYear and [Amount] <> 0)) >= 3

【讨论】:

  • 感谢 Wedge 提供的解决方案。你的假设是正确的!这正是我想要的。我会对其进行测试,如果它有效,我会将其标记为答案!
  • 我已经尝试了您提供的解决方案,它“有点”有效。它确实给了我想要的结果,但是加载 9 行的测试集需要很长时间。我想使用它的数据集有超过 4000 条记录。为什么这个解决方案这么慢?
  • 它在表上运行一个独特的过滤器,以便能够计算有效行数,所以即使它“有效”,我也不知道这在性能端是否实用。我觉得应该有更好的方法,因为在 Excel 中做起来非常简单......
【解决方案3】:

DAX 就是你正在寻找的 for

使用数据分析表达式 (DAX) 解决一些基本的计算和数据分析问题

【讨论】:

  • 谢谢,但已经尝试过使用 DAX,您能否帮我举一些例子来解决我的问题。我在 DAX 中找不到正确的答案,我在 M 中也找不到它
猜你喜欢
  • 2023-02-03
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 2019-03-09
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
相关资源
最近更新 更多