整理数据透视表中的多列

Collate Multiple Columns in Pivot Table

提问人:Scottasaurus 提问时间:11/15/2023 最后编辑:Ron RosenfeldScottasaurus 更新时间:11/15/2023 访问量:60

问:

我正在一个跟踪器中工作,其中的行是按项目组织的。跟踪器包括标识项目的主要和支持经理的列,以及经理每周在项目上花费的 # 小时数:

Project Tracker 表
Project Tracker table

我正在尝试创建一个数据透视表,其中列出了每个经理、每周在所有项目上工作的总小时数以及支持的项目总数:

所需输出
desired output

我在建立关系时遇到了问题,这些关系允许我对 C、E 和 G 列中的值求和,并按经理名称进行筛选。我不认为我可以构建查找或索引/匹配公式,因为经理可以在同一列中多次列出。

我在建立关系时遇到了问题,这些关系允许我对 C、E 和 G 列中的值求和,并按经理名称进行筛选。我不认为我可以构建查找或索引/匹配公式,因为经理可以在同一列中多次列出。

示例数据文件:

示例项目跟踪器

Excel 数据透视表

评论

0赞 Ron Rosenfeld 11/15/2023
您可以使用(在 Excel 2010 及更高版本中可用)将表取消透视为“经理/小时”对,然后以这种方式生成摘要。Power QueryProject Tracker

答:

1赞 JvdV 11/15/2023 #1

只是为了好玩,我想尝试一下新的 GROUPBY() 函数:

enter image description here

公式:I1

=LET(x,WRAPROWS(TOCOL(B2:G6),2),y,TAKE(x,,1),z,GROUPBY(y,DROP(x,,1),SUM,,0,,y<>"N/A"),VSTACK({"Manager","Hours Per Week","Projects Supported"},HSTACK(z,COUNTIF(B2:G6,TAKE(z,,1)))))
0赞 Mayukh Bhattacharya 11/15/2023 #2

这是一个解决方案,您也可以尝试。发布替代方案,因为目前 GROUPBYPIVOTBY 函数都位于 Windows Excel 和 Mac Excel 的 Beta 频道


enter image description here


• 细胞中使用的配方I1

=LET(
     α, WRAPROWS(TOCOL(DROP(A2:G6,,1)),2),
     φ, FILTER(α, TAKE(α,,1)<>"N/A"),
     δ, TAKE(φ,,1),
     ε, MMULT(N(δ=TOROW(δ)),DROP(φ,,1)),
     Ψ, MMULT(N(δ=TOROW(δ)),DROP(φ,,1)^0),
     VSTACK({"Manager","Hours Per Week","Projects Supported"},
     SORT(UNIQUE(HSTACK(δ, ε, Ψ)))))

这也可以使用 快速轻松地完成。要使用上述程序实现此目的,请使用窗口执行以下简单步骤:POWER QUERYPOWER QUERYUI


  • 首先将源范围转换为表并相应地命名,在本例中,我将其命名为Table1

  • 接下来,从 Tab --> 打开一个空白查询DataGet & Transform Data --> Get Data --> From Other Sources --> Blank Query

  • 上面让窗口打开,现在从 Tab --> --> 并通过删除您看到的任何内容来粘贴以下内容,然后按Power QueryHomeAdvanced EditorM-CodeDone

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Removed Columns" = Table.RemoveColumns(Source,{"Project Name"}),
    #"Unpivoted Only Selected Columns" = Table.Unpivot(#"Removed Columns", {"Lead Manager", "Lead Weekly Hours", "First Support Manager", "First Support Weekly Hours", "Second Support Manager", "Second Support Weekly Hours"}, "Attribute", "Value"),
    #"Added Conditional Column" = Table.AddColumn(#"Unpivoted Only Selected Columns", "Hours", each if Text.Contains([Attribute], "Hours") then [Value] else null),
    #"Filled Up" = Table.FillUp(#"Added Conditional Column",{"Hours"}),
    #"Filtered Rows" = Table.SelectRows(#"Filled Up", each not Text.Contains([Attribute], "Hours")),
    #"Removed Columns1" = Table.RemoveColumns(#"Filtered Rows",{"Attribute"}),
    #"Filtered Rows1" = Table.SelectRows(#"Removed Columns1", each [Value] <> null and [Value] <> ""and [Value] <> "N/A"),
    #"Grouped Rows" = Table.Group(#"Filtered Rows1", {"Value"}, {{"Manager", each _, type table [Value=text, Hours=number]}, {"Hours Per Week", each List.Sum([Hours]), type number}, {"Projects Supported", each Table.RowCount(_), Int64.Type}}),
    #"Removed Columns2" = Table.RemoveColumns(#"Grouped Rows",{"Manager"}),
    #"Renamed Columns" = Table.RenameColumns(#"Removed Columns2",{{"Value", "Manager"}}),
    #"Sorted Rows" = Table.Sort(#"Renamed Columns",{{"Manager", Order.Ascending}})
in
    #"Sorted Rows"

enter image description here


  • 最后,要将其导入回 --> 单击或 --> 第一个单击的将创建一个具有所需输出的输出,而后者将提示一个窗口,询问您将结果放置在哪里。ExcelClose & LoadClose & Load ToNew Sheet

enter image description here


0赞 Ron Rosenfeld 11/15/2023 #3

这是另一种Power Query算法,如果你有一个大型数据库,它应该比我测试过的其他算法执行得更快。

此外,它与实际列名无关,要求它们仅按以下顺序排列:

|Project|Manager|Hours|Manager|Hours|...|

注意如果一个经理可能在同一上列出两次(即:一个项目中的两个角色),我们将需要修改代码以考虑到这一点

使用 Power Query

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

您的数据
enter image description here

M代码

let

//change next lines to reflect actual table source
    Source = Excel.CurrentWorkbook(){[Name="Table20"]}[Content],

    cn = List.Buffer(Table.ColumnNames(Source)),
    managers = List.Buffer(List.Alternate(cn,1,1)),
    hours = List.Buffer(List.RemoveFirstN(List.Alternate(cn,1,1,1),1)),

    #"Set Data Types" = Table.TransformColumnTypes(Source, 
        {{cn{0}, type text}} 
        & List.Transform(managers, each {_, type text}) 
        & List.Transform(hours, each {_, type number})),

    #"Split Tables" = Table.Combine(List.Generate(
        ()=>[t=Table.FromColumns(
                Table.ToColumns(
                    Table.SelectColumns(#"Set Data Types",{cn{0},managers{0},hours{0}})),
                    type table[Project=text, Manager=text, Hours=number]), idx=0],
        each [idx]<List.Count(managers),
        each [t=Table.FromColumns(
                Table.ToColumns(
                    Table.SelectColumns(#"Set Data Types",{cn{0},managers{[idx]+1},hours{[idx]+1}})),
                    type table[Project=text, Manager=text, Hours=number]),
                     idx=[idx]+1],
        each [t]
    )),
    #"Filtered Rows" = Table.SelectRows(#"Split Tables", each ([Manager] <> "N/A")),
    #"Grouped Rows" = Table.Group(#"Filtered Rows", {"Manager"}, {
        {"Hours Per Week", each List.Sum([Hours]), type number}, 
        {"Projects Supported", each Table.RowCount(_), Int64.Type}})
in
    #"Grouped Rows"

结果
enter image description here