PowerQuery - 运行差异列 - 有点像运行总计

时间:2021-05-21 09:29:09

标签: excel powerbi dax powerquery powerpivot

我有一个关节问题,我不确定用什么最好的方式来描述。

我正在尝试在 PowerQuery /(PowerBI 的转换部分)中生成运行总计和运行差异列。

我正在按性别查看某个地区 4 个不同地点的人口数据。 所以有一个位置的性别人口和总人口。推而广之,还有一个地区性别和地区总人口。

例如

enter image description here

在某个日期,我正在数吃汉堡包的人数。 (我不是,但我试图保持它的通用性)。

这一天将有一个地点的总人口。

例如

enter image description here

我想为

生成列

总计: 在那个地方吃过汉堡的人(所以今天的价值 (tv) 添加到昨天的价值 (yv) ) 在那个地方吃过汉堡的男性 在那个地方吃过汉堡的女性

运行差异: 尚未在该位置吃过汉堡包的人(所以昨天的位置人口(lpy) - 电视) 还没有在那个地方吃过汉堡的男性 还没有在那个地方吃过汉堡的女性

定义后,构建powerquery应该会变得更容易,以便可以计算:

某个地点在特定日期吃过/未吃过汉堡的男性总数 该地点在特定日期吃过/未吃过汉堡的男性人口

依此类推,您可以计算一个地点有多少人吃过/没有吃过汉堡,以及这对总地点比例和汉堡消费的面积比例有何影响。

我可以在 BI 中快速生成一个快速度量来执行运行总计。但我遇到的问题是创建一个更复杂的运行总数。事实上,如果我以正确的方式运行它?

我有一个汇总数据表,其中包含一个地区的人口分母。我想在处理过的表格中逐行列出剩余的人口,以便我可以说“x % 的男性,y % 的女性,xy 位置 1 的人吃过/没有吃过汉堡包”。

我什至不确定将表格拆分到位置是否正确。

总结:我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

这可能会让您开始使用 Power Query。

这是一种为男性和女性生成单独运行总计的方法。

它是作为一个单独的函数编写的,因此也可以用于分组表。

它使用 List.Generate 函数以及 Buffered List 来提高速度。

fnRunningTotal

(values as list) as list =>
let 
    RT = List.Generate(
            ()=> [RT = values{0}, counter = 0],
            each [counter] < List.Count(values),
            each [RT = [RT] + values{[counter]+1}, counter = [counter]+1],
            each [RT]
    )
in 
    RT

Main MCode 编辑以稍微缩短代码

let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{
        {"Date", type date}, {"Location", type text}, {"Gender", type text}, {"Value", Int64.Type}, {"TotalPop", Int64.Type}}),

//add custom columns to separate by Gender
    #"Added Custom" = Table.AddColumn(#"Changed Type", "maleValue", each if [Gender] = "M" then [Value] else 0),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "femaleValue", each if [Gender] = "F" then [Value] else 0),

//running totals for each Gender column
    buffMale = List.Buffer(#"Added Custom1"[maleValue]),
    buffFemale = List.Buffer(#"Added Custom1"[femaleValue]),
    RT = Table.FromColumns(
            List.Combine({Table.ToColumns(#"Added Custom1"),
                          {fnRunningTotal(buffMale), fnRunningTotal(buffFemale)}}),
            List.Combine({Table.ColumnNames(#"Added Custom1"),
                          {"runningTotalMale","runningTotalFemale"}})
        ),
    #"Removed Columns" = Table.RemoveColumns(RT,{"maleValue", "femaleValue"})    
in
    #"Removed Columns"

原创
enter image description here

结果
enter image description here