excel - Power BI - 采用多列年份和值列并合并为 2 列

标签 excel powerbi powerquery unpivot m

我正在尝试以更可用的格式获取我的数据。我有以下列。

Donor     2019 Date  2019 Amt  2018 Date  2018 Amt  2017 Date  2017 Amt
--------  ---------  --------  ---------  --------  ---------  --------
Person 1  1/15/2019    100.00  4/20/2018     75.00  NULL           0.00 
Person 2  NULL           0.00  7/15/2018     50.00  NULL           0.00
Person 3  2/21/2019     50.00  3/03/2018     50.00  2/28/2017     50.00

这个数据实际上可以追溯到 2010 年。

我想要的是:
Donor     Date       Amt
--------  ---------  ------
Person 1  1/15/2019  100.00
Person 1  4/20/2018   75.00
Person 2  7/15/2018   50.00
Person 3  2/21/2019   50.00
Person 3  3/03/2018   50.00
Person 3  3/28/2017   50.00

我玩过一些 Unpivoting 数据,但没有什么让我感到厌烦的就是让我得到我想要的东西。我认为可能需要进行一些转换才能完全满足我的需要。

最佳答案

您可以使用两个 unpivot 和一个过滤器来做到这一点:

选择所有年份日期列并取消透视,然后选择所有年份金额列并取消透视。最后,过滤到这些年份匹配的行。

完整的 M 代码:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCkgtKs7PUzBU0lEy1Dc01TcyMLQEsQ0MgKQJkAsSsQCyzU2BBBAZKMXqwLUZwcSA8lDdILWmBljUGgMFjPSNDGFWgBUZ6xujaAIqsAAJmEMEYmMB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Donor = _t, #"2019 Date" = _t, #"2019 Amt" = _t, #"2018 Date" = _t, #"2018 Amt" = _t, #"2017 Date" = _t, #"2017 Amt" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Donor", type text}, {"2019 Date", type date}, {"2019 Amt", Int64.Type}, {"2018 Date", type date}, {"2018 Amt", Int64.Type}, {"2017 Date", type date}, {"2017 Amt", Int64.Type}}),
    #"Unpivoted Year Date" = Table.Unpivot(#"Changed Type", {"2019 Date", "2018 Date", "2017 Date"}, "Year Date", "Date"),
    #"Unpivoted Year Amt" = Table.Unpivot(#"Unpivoted Year Date", {"2019 Amt", "2018 Amt", "2017 Amt"}, "Year Amt", "Amt"),
    #"Match Years Filter" = Table.SelectRows(#"Unpivoted Year Amt", each Text.Start([Year Date], 4) = Text.Start([Year Amt], 4))
in
    #"Match Years Filter"

如果您有很多列,此解决方案应该更方便。

使用 Table.ColumnNames 使用一点 M 代码魔法您可以像这样使其完全动态:
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCkgtKs7PUzBU0lEy1Dc01TcyMLQEsQ0MgKQJkAsSsQCyzU2BBBAZKMXqwLUZwcSA8lDdILWmBljUGgMFjPSNDGFWgBUZ6xujaAIqsAAJmEMEYmMB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Donor = _t, #"2019 Date" = _t, #"2019 Amt" = _t, #"2018 Date" = _t, #"2018 Amt" = _t, #"2017 Date" = _t, #"2017 Amt" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Donor", type text}, {"2019 Date", type date}, {"2019 Amt", Int64.Type}, {"2018 Date", type date}, {"2018 Amt", Int64.Type}, {"2017 Date", type date}, {"2017 Amt", Int64.Type}}),
    #"Unpivoted Year Date" = Table.Unpivot(#"Changed Type", List.Select(Table.ColumnNames(#"Changed Type"), each Text.EndsWith(_, " Date")), "Year Date", "Date"),
    #"Unpivoted Year Amt" = Table.Unpivot(#"Unpivoted Year Date", List.Select(Table.ColumnNames(#"Changed Type"), each Text.EndsWith(_, " Amt")), "Year Amt", "Amt"),
    #"Match Years Filter" = Table.SelectRows(#"Unpivoted Year Amt", each Text.Start([Year Date], 4) = Text.Start([Year Amt], 4))
in
    #"Match Years Filter"

这部分
List.Select(Table.ColumnNames(#"Changed Type"), each Text.EndsWith(_, " Amt"))

获取所有列名并挑选出以 " Amt" 结尾的列名.

关于excel - Power BI - 采用多列年份和值列并合并为 2 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57363557/

相关文章:

powerbi - 从 Power BI 中存在的数据集中的列中删除所有 HTML 标签

excel - 等待查询完成后再继续

当输入括号时,VBA 创建公式会导致 1004 错误,并在输入空格时导致更新值框

excel - 从不同的工作表中获取列数据并将其作为MainSheet中的行数据

data-visualization - 在 power bi 中可视化上次刷新日期

performance - 计算表与从服务器导入

regex - R 中的 LEFT 加 FIND 函数相当于什么?

vba - 根据一个单元格值并引用​​另一单元格值复制行并粘贴到新工作表上

powerbi - Power Query - 仅删除连续的重复项

xml - 需要使用 Power Query 将 XML 导入 Excel 的帮助