Excel 数据透视表:我可以像分析单列一样分析两列数据吗?

问题描述 投票:0回答:1

我有一个表格来跟踪轮班部分的交易。它们按日期记录为数据对,一个人获得正信用,另一个人获得负信用。

Column
1 - Date
2 - Name
3 - Hours (Positive)
4 - Name
5 - Hours (Negative)

我想要一个数据透视表,其中包含单个员工列表和一个显示所涵盖时间段内的净余额的数字。

我尝试在数据透视表中插入一个字段(Field1)作为“小时”(负小时)和“小时2”(正小时)的计算字段。但它将负工作时间的卡洛斯视为与正工作时间的卡洛斯不同的人,而不是创建卡洛斯净工作时间的总和。
基本数据

预期结果

excel pivot-table
1个回答
0
投票

您可以取消旋转表格,然后创建表格,特别是如果您有

365

但是,这也可以使用 Windows Excel 2010+ 和 Microsoft 365(Windows 或 Mac)中提供的 Power Query 来完成。

此解决方案适用于任意数量的“人-小时”配对列。

使用 Power Query

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

//Change next lines to reflect actual data source
    Source = Excel.CurrentWorkbook(){[Name="Shifts"]}[Content],


//can have multiple person-hour pairs after the first "Date" column
    personCols = List.Alternate(List.RemoveFirstN(Table.ColumnNames(Source),1),1,1,1),
    hoursCols = List.Alternate(List.RemoveFirstN(Table.ColumnNames(Source),1),1,1,0),
    typeSets = {{"Date", type date}} & List.Transform(personCols, each {_, type text}) & List.Transform(hoursCols, each {_, type number}),

//Set the data types
    #"Changed Type" = Table.TransformColumnTypes(Source, typeSets),

//Unpivot the data columns
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"Date"}, "Attribute", "Value"),

//Remove now uneeded columns
    #"Removed Columns" = Table.RemoveColumns(#"Unpivoted Other Columns",{"Date", "Attribute"}),

//add a "shifted" column to facilitate matching the person with their hours
    #"Add Shifted Values" = Table.FromColumns(
        Table.ToColumns(#"Removed Columns") &
        {List.RemoveFirstN(#"Removed Columns"[Value],1) & {null}},
        type table[Person=text, Hours=number]),

//Remove unneeded rows
    #"Removed Alternate Rows" = Table.AlternateRows(#"Add Shifted Values",1,1,1),

//Group by Person and SUM the hours for each
    #"Grouped Rows" = Table.Group(#"Removed Alternate Rows", {"Person"}, {{"Sum", each List.Sum([Hours]), type number}}),

//Sort result in alphabetical order
    #"Sorted Rows" = Table.Sort(#"Grouped Rows",{{"Person", Order.Ascending}})
in
    #"Sorted Rows"

© www.soinside.com 2019 - 2024. All rights reserved.