PowerQuery - 来自 table 的预测

PowerQuery - Forecast from table

我正在尝试为部门创建一个预测(单个 table),以便在单个 table 中输入他们对支出的假设。我希望用户输入每个类别的金额、频率、开始日期和结束日期,而不是输入每个月的金额。为了说明,请参阅下面的 table 和一些示例数据。

这是我试图在 Power Query(或 Power BI)中得到的结果,这是我对如何能够 运行 在与实际情况。

如果这不能用 DAX 完成,而必须在 excel 中完成(通过查找公式),您将如何构建公式?

这是一个 PQ 示例,根据您输入的显示内容创建您想要显示的内容 table:

使用 Power Query

  • Select 数据中的某个单元格 Table
  • Data => Get&Transform => from Table/Range
  • 当 PQ 编辑器打开时:Home => Advanced Editor
  • 记下第 2 行Table名称
  • 粘贴下面的 M 代码代替您看到的内容
  • 将第 2 行中的 Table 名称更改回最初生成的名称。
  • 阅读评论并探索 Applied Steps 以更好地理解算法

M码

let
    Source = Excel.CurrentWorkbook(){[Name="Table9"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"G/L", Int64.Type}, {"Dimension", type text}, {"Description", type text}, 
        {"Amount", Int64.Type}, {"Repeat Every", type text}, {"Start Date", type date}, {"End Date", type date}}),

//Last possible date as Today + 5 years (to end of month)
    lastDt = Date.EndOfMonth(Date.AddYears(Date.From(DateTime.FixedLocalNow()),5)),

//Generate list of all possible dates for a given row using List.Generate function
    allDates = Table.AddColumn(#"Changed Type", "allDates", each let 
            lastDate = List.Min({lastDt,[End Date]}),
            intvl = {1,3,6}{List.PositionOf({"Monthly","Quarterly","Semi Annual"},[Repeat Every])}
        in 
            List.Generate(
                ()=> [Start Date],
                each _ <= lastDate,
                each Date.EndOfMonth(Date.AddMonths(_,intvl)))),

//Remove unneeded columns and expand the list of dates
    #"Removed Columns" = Table.RemoveColumns(allDates,{"Repeat Every", "Start Date", "End Date"}),
    #"Expanded allDates" = Table.ExpandListColumn(#"Removed Columns", "allDates"),

//Sort to get desired output
//  Date column MUST be sorted to ensure correct order when pivoted
//  Other columns sorted alphanumerically, but could change the sort to reflect original order if preferred.
    #"Sorted Rows" = Table.Sort(#"Expanded allDates",{
        {"allDates", Order.Ascending}, 
        {"G/L", Order.Ascending}, 
        {"Dimension", Order.Ascending}}),

//Pivot the date column with no aggregation
    #"Pivoted Column" = Table.Pivot(
            Table.TransformColumnTypes(#"Sorted Rows", {
                {"allDates", type text}}, "en-US"), 
            List.Distinct(Table.TransformColumnTypes(#"Sorted Rows", {{"allDates", type text}}, "en-US")[allDates]), 
                "allDates", "Amount")
in
    #"Pivoted Column"

原始数据

结果