我正在使用Excel中的PowerQuery创建一个具有旋转数据的常规报告。该中心最近四个季度的列名按日期顺序排列(例如,2018年9月30日、2018年12月31日、2019年3月31日、2019年6月30日)。每个日期列中的值都是数字的。每次报告运行时,列名都会更改,because...new日期!
行代表不同的实体(例如妈妈银行、爸爸银行、爷爷银行)。我需要创建一些派生列来计算最近季度列(最后一列)和前一季度列(例如3个月移动,6个月移动)之间的差异。以下是一些示例数据:
这就是数据在枢轴之前的样子:
Entity_Name Quarter Date Value
Bank of Dad 30/09/2018 4
Bank of Dad 31/12/2018 2
Bank of Dad 31/03/2019 3
Bank of Dad 30/06/2019 3
Bank of Grandpa 30/09/2018 4
Bank of Grandpa 31/12/2018 6
Bank of Grandpa 31/03/2019 1
Bank of Grandpa 30/06/2019 2
Bank of Mum 30/09/2018 5
Bank of Mum 31/12/2018 5
Bank of Mum 31/03/2019 4
Bank of Mum 30/06/2019 4
在枢轴之后:
Entity_Name 30/09/2018 31/12/2018 31/03/2019 30/06/2019
Bank of Grandpa 4 6 1 2
Bank of Mum 5 5 4 4
Bank of Dad 4 2 3 3
这就是我想要达到的目标(三个月前和六个月前的最后一个季度):
Entity_Name Movement (3 months) Movement (6 months)
Bank of Grandpa 1 -4
Bank of Mum 0 -1
Bank of Dad 0 1
我在互联网上进行了一次很好的搜索,我发现了类似的例子,但并不完全是这样的(通常与重命名列或从列中筛选值有关)。我的问题其实比我所发现的要简单得多,所以我觉得这应该是相对简单的,我只是遗漏了一些其他人都不需要质疑的显而易见的问题。我是第一次在PowerQuery工作的熊猫/蟒蛇女孩(我需要把这个交给一个客户,以便正常运行,所以我需要报告来“讲”他们的语言--也就是excel。)PowerQuery确实做得很好(在excel中加入并分组?-酷!)其他的事情都是有点斗志-像这样!
我有两种方法来看待这个问题--首先,试着在支点之前做到这一点,这样我就不会为改变列名而挣扎了。这是卷曲的。如果只有一个实体,它可能会更简单,但是多个实体会使它变得棘手。我最喜欢的方法是从旋转数据中派生列,这与以前如何编写此报告(在excel中,而不是使用power查询)一致。要做到这一点,我需要在添加新列时按位置引用列。
如果我能解决一个通过位置引用保存另一列值的列返回的问题,那么我就有99%的方法在那里,所以我在寻找解决问题的特定部分的帮助。
也就是说,通过使用列的位置引用(而不是显式列名)来达到这一点:
Entity_Name 30/09/2018 ... Values_in_col_1
Bank of Dad 4 ... 4
Bank of Grandpa 4 ... 4
Bank of Mum 5 ... 5
这就是我尝试过的:
let
Source = Excel.CurrentWorkbook(){[Name="Table14"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Entity name", type text}, {"Quarter date", type date}, {"Value", Int64.Type}}),
#"Sorted Rows" = Table.Sort(#"Changed Type",{{"Entity name", Order.Ascending}, {"Quarter date", Order.Ascending}}),
#"PrevTable" = Table.Pivot(Table.TransformColumnTypes(#"Sorted Rows", {{"Quarter date", type text}}, "en-NZ"), List.Distinct(Table.TransformColumnTypes(#"Sorted Rows", {{"Quarter date", type text}}, "en-NZ")[#"Quarter date"]), "Quarter date", "Value", List.Sum),
#"Column names" = Table.ColumnNames(#"PrevTable"),
#"Test 1" = Table.AddColumn(#"PrevTable", "Test1", each #"Column names"{1}),
#"Test 2" = Table.AddColumn(#"Test 1", "Test2", each Table.SelectRows(#"PrevTable", each(Record.Field(_,Table.ColumnNames(#"PrevTable"){1}))))
in
#"Test 2"
测试1:我已经到了可以创建列名列表并通过索引引用它们的地步--但是返回的是作为列名的值列,而不是实际值!哈哈。
测试2:我还尝试了另一种方法,看看我是否能够检索行值(尝试重做我发现的代码,这也是为了过滤),但是它返回一个没有列的表。
下面是我从代码中得到的表:
Entity_Name 30/09/2018 ... Test1 Test2
Bank of Dad 4 ... 30/09/2018 [Table]
Bank of Grandpa 4 ... 30/09/2018 [Table]
Bank of Mum 5 ... 30/09/2018 [Table]
如果单击“Table”值,就会得到以下类型的响应:
Expression.Error:我们不能将值4转换为逻辑类型。
任何帮助都是非常感激的--这么多的学习工具,那么少的大脑!
发布于 2019-05-16 16:41:24
我花了3个小时搜索并写了一个很长的问题,不知怎么的,我奇迹般地找到了答案这里的线索。
以下是我如何创建(其中一个)派生列:
#"Quarterly movement" = Table.AddColumn(#"PrevTable", "Quarterly change", each (Record.Field(_, Table.ColumnNames(#"PrevTable"){4}) - Record.Field(_, Table.ColumnNames(#"PrevTable"){3})))
如果我只想创建一个列,它使用位置引用(问题的核心)来反映另一个值:
#"Test" = Table.AddColumn(PrevTable, "Test", each (Record.Field(_, Table.ColumnNames(#"PrevTable"){1})))
https://stackoverflow.com/questions/56177754
复制