如何解决使用PowerQuery在几个月内按比例计算结果
我目前在以下问题上陷入困境:
我有两个必须使用的表格,一个包含船舶的财务信息,另一个包含船舶的到达和离开时间。我得到的数据结合了来自不同文件夹的多个Excel工作表:
我必须计算以上航次的结果,然后分别在6月,7月和8月分摊估计和更新的结果。
6月时间:4小时(20/06/2020 20:00-23:59)+ 10天(21/06/2020 00:00-30/06/2020 23:59)= 10.1666
7月:整整31天
8月的时间:1天+ 14小时(2020年8月2日00:00-14:00)= 1.5833
总航行时间= 10.1666 + 31 + 1.5833 = 42.7499
“已更新”的FinancialItem的结果如下:
六月的结果:100 *(10.1666 / 42.7499)= 23.7816
7月结果:100 *(31 / 42.7499)= 72.5148
八月结果:100 *(1.5833 / 42.7499)= 3.7036
总和= 100
然后对于“估计”,它是以上所有内容的两倍。
这是我理想中想要的格式:
我必须为多艘具有多个跨度和多个航程号的船只进行此操作。 急切等待答复(如果有)。预先非常感谢。
Brds,
解决方法
不知道您是否还在寻找答案,但是下面的代码为您提供了预期的输出:
let
financialTable = Table.FromRows({{"A",1,"profit/loss",200,100}},type table [vesselName = text,vesselNumber = Int64.Type,financialItem = text,estimated = number,updated = number]),voyageTimeTable = Table.FromRows({{"A",#datetime(2020,6,20,0),8,2,14,0)}},voyageStartDatetime = datetime,voyageEndDatetime = datetime]),joined =
let
joined = Table.NestedJoin(financialTable,{"vesselName","vesselNumber"},voyageTimeTable,"$toExpand",JoinKind.LeftOuter),expanded = Table.ExpandTableColumn(joined,{"voyageStartDatetime","voyageEndDatetime"})
in expanded,toExpand = Table.AddColumn(joined,(currentRow as record) =>
let
voyageInclusiveStart = DateTime.From(currentRow[voyageStartDatetime]),voyageExclusiveEnd = DateTime.From(currentRow[voyageEndDatetime]),voyageDurationInDays = Duration.TotalDays(voyageExclusiveEnd - voyageInclusiveStart),createRecordForPeriod = (someInclusiveStart as datetime) => [
inclusiveStart = someInclusiveStart,exclusiveEnd = List.Min({
DateTime.From(Date.EndOfMonth(DateTime.Date(someInclusiveStart)) + #duration(1,0)),voyageExclusiveEnd
}),durationInDays = Duration.TotalDays(exclusiveEnd - inclusiveStart),prorataDuration = durationInDays / voyageDurationInDays,estimated = prorataDuration * currentRow[estimated],updated = prorataDuration * currentRow[updated],month = Date.MonthName(DateTime.Date(inclusiveStart)),year = Date.Year(inclusiveStart)
],monthlyRecords = List.Generate(
() => createRecordForPeriod(voyageInclusiveStart),each [inclusiveStart] < voyageExclusiveEnd,each createRecordForPeriod([exclusiveEnd])
),toTable = Table.FromRecords(monthlyRecords)
in toTable
),expanded =
let
dropped = Table.RemoveColumns(toExpand,{"estimated","updated","voyageStartDatetime","voyageEndDatetime"}),expanded = Table.ExpandTableColumn(dropped,{"month","year","estimated","updated"})
in expanded
in
expanded
代码尝试执行以下操作:
- 加入
financialTable
和voyageTimeTable
,因此对于每个vesselName
和vesselNumber
组合,我们知道:estimated
,updated
,{{ 1}}和voyageStartDatetime
。 - 生成
voyageEndDatetime
和voyageStartDatetime
之间的月份列表(这些月份会扩展到新的表格行中) - 对于每个月(在列表中),请执行您在问题中提到的所有算法
- 摆脱一些列(例如旧的
voyageEndDatetime
和estimated
列)
我建议使用数据集中的不同updated
和vesselName
对其进行测试,以查看输出是否始终正确(我认为应该如此)。
您应该能够手动检查vesselNumber
步骤/表达式的$toExpand
列中的单元格,以查看嵌套行在展开之前的情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。