Vb.net 如何使用LINQ或其他方法将表数据分组并按多列求和

Vb.net 如何使用LINQ或其他方法将表数据分组并按多列求和,vb.net,linq,Vb.net,Linq,我有一个包含类似以下数据的表: Shift--Name----------Department---Time 1 Employee1 360 100 1 Employee1 372 50 1 Employee1 385 300 2 Employee2 301 0 2 Employee2 301 0 2 Emp

我有一个包含类似以下数据的表:

Shift--Name----------Department---Time
1      Employee1         360      100
1      Employee1         372      50
1      Employee1         385      300
2      Employee2         301      0
2      Employee2         301      0
2      Employee2         301      0
2      Employee2         305      0
2      Employee2         305      0
2      Employee2         305      0
2      Employee2         305      0
2      Employee2         305      0
2      Employee2         320      0
2      Employee2         333      0
2      Employee2         350      30
2      Employee2         350      35
2      Employee2         350      90
2      Employee2         350      0
2      Employee2         350      0
2      Employee2         350      90
2      Employee2         350      0
2      Employee2         350      0
2      Employee2         350      150
2      Employee2         350      50
2      Employee2         350      0
2      Employee2         350      60
2      Employee3         302      0
2      Employee3         305      0
2      Employee3         305      3
2      Employee3         365      0
2      Employee3         365      0
2      Employee3         365      0
2      Employee3         365      10
2      Employee3         365      1
2      Employee3         365      0
2      Employee3         365      0
2      Employee3         365      10
2      Employee3         365      5
2      Employee4         314      0
2      Employee4         314      0
2      Employee4         314      100
Shift--Name----------Department---Time
1      Employee1         360      100
                         ***      100

1      Employee1         372      50
                         ***      50

1      Employee1         385      300
                         ***      300
       ***                        450
***                               450

2      Employee2         301      0
2      Employee2         301      0
2      Employee2         301      0
                         ***      0

2      Employee2         305      0
2      Employee2         305      0
2      Employee2         305      0
2      Employee2         305      0
2      Employee2         305      0
                         ***      0

2      Employee2         320      0
                         ***      0

2      Employee2         333      0
                         ***      0

2      Employee2         350      30
2      Employee2         350      35
2      Employee2         350      90
2      Employee2         350      0
2      Employee2         350      0
2      Employee2         350      90
2      Employee2         350      0
2      Employee2         350      0
2      Employee2         350      150
2      Employee2         350      50
2      Employee2         350      0
2      Employee2         350      60
                         ***      505
       ***                        505

2      Employee3         302      0
                         ***      0

2      Employee3         305      0
2      Employee3         305      3
                         ***      3

2      Employee3         365      0
2      Employee3         365      0
2      Employee3         365      0
2      Employee3         365      10
2      Employee3         365      1
2      Employee3         365      0
2      Employee3         365      0
2      Employee3         365      10
2      Employee3         365      5
                         ***      26
       ***                        29

2      Employee4         314      0
2      Employee4         314      0
2      Employee4         314      100
                         ***      100
       ***                        100
我是VB.NET新手,但我需要按班次、名称、部门输出上面的表分组,然后获得每个组的时间总和,如下所示:

Shift--Name----------Department---Time
1      Employee1         360      100
1      Employee1         372      50
1      Employee1         385      300
2      Employee2         301      0
2      Employee2         301      0
2      Employee2         301      0
2      Employee2         305      0
2      Employee2         305      0
2      Employee2         305      0
2      Employee2         305      0
2      Employee2         305      0
2      Employee2         320      0
2      Employee2         333      0
2      Employee2         350      30
2      Employee2         350      35
2      Employee2         350      90
2      Employee2         350      0
2      Employee2         350      0
2      Employee2         350      90
2      Employee2         350      0
2      Employee2         350      0
2      Employee2         350      150
2      Employee2         350      50
2      Employee2         350      0
2      Employee2         350      60
2      Employee3         302      0
2      Employee3         305      0
2      Employee3         305      3
2      Employee3         365      0
2      Employee3         365      0
2      Employee3         365      0
2      Employee3         365      10
2      Employee3         365      1
2      Employee3         365      0
2      Employee3         365      0
2      Employee3         365      10
2      Employee3         365      5
2      Employee4         314      0
2      Employee4         314      0
2      Employee4         314      100
Shift--Name----------Department---Time
1      Employee1         360      100
                         ***      100

1      Employee1         372      50
                         ***      50

1      Employee1         385      300
                         ***      300
       ***                        450
***                               450

2      Employee2         301      0
2      Employee2         301      0
2      Employee2         301      0
                         ***      0

2      Employee2         305      0
2      Employee2         305      0
2      Employee2         305      0
2      Employee2         305      0
2      Employee2         305      0
                         ***      0

2      Employee2         320      0
                         ***      0

2      Employee2         333      0
                         ***      0

2      Employee2         350      30
2      Employee2         350      35
2      Employee2         350      90
2      Employee2         350      0
2      Employee2         350      0
2      Employee2         350      90
2      Employee2         350      0
2      Employee2         350      0
2      Employee2         350      150
2      Employee2         350      50
2      Employee2         350      0
2      Employee2         350      60
                         ***      505
       ***                        505

2      Employee3         302      0
                         ***      0

2      Employee3         305      0
2      Employee3         305      3
                         ***      3

2      Employee3         365      0
2      Employee3         365      0
2      Employee3         365      0
2      Employee3         365      10
2      Employee3         365      1
2      Employee3         365      0
2      Employee3         365      0
2      Employee3         365      10
2      Employee3         365      5
                         ***      26
       ***                        29

2      Employee4         314      0
2      Employee4         314      0
2      Employee4         314      100
                         ***      100
       ***                        100
所以对于员工1,我可以看到他们在360部门总共花了100分钟,在372部门花了50分钟,在385部门花了300分钟。员工1的总时间为450分钟。由于第一班只有一名员工,因此第一班的总分钟数为450分钟。 关于如何制定LINQ查询以获得所需分组,有什么建议吗

如果有比使用LINQ更好的方法,我很乐意听到,我只是认为LINQ将是处理问题的最通用的方法,我可以根据其他类似的需求修改它

编辑:

我尝试了以下查询,但不完全理解它是如何获得所需结果的:

Dim TimeGroups =
    From j In TotalTimeResults
    Group By x = New With {
        Key .Shift = j.Field(Of String)("Shift"),
        Key .Name = j.Field(Of String)("Name"),
        Key .Time = j.Field(Of Integer)("Time")} Into g = Group
    Select New With {
        .Shift = x.Shift,
        .Name = x.Name,
        .Time = x.Time,
        .total = g.Sum(Function(r) r.Field(Of Integer)("Time"))
    }

我使用的表只是一个VB.NET DataTable,其中显示了列和行。

我认为这将产生您需要的结果:

Dim TimeGroups = From t In TotalTimeResults
                 Group t By t.Shift Into tsg = Group
                 Select New With { .Shift = Shift, .ShiftTotal = tsg.Sum(Function(t) t.Time),
                     .NameGroup = From t In tsg
                                 Group t By t.Name Into tng = Group
                                 Select New With {
                                     .Name = Name,
                                     .NameTotal = tng.Sum(Function(t) t.Time),
                                     .DeptGroup = From t In tng
                                                 Group t By t.Dept Into tdg = Group
                                                 Select New With { .Dept = Dept, .DeptTotal = tdg.Sum(Function(t) t.Time), .EmpInd = From t In tdg Select t.Time } } }

您能描述一下您已经尝试了哪些查询,以及您在哪里遇到了困难吗?您所描述的可以通过使用逐组汇总或逐组分组集在SQL查询中实现。我假设您正在使用MSSQL-检查MSDN文章:@C-Otto我尝试了以下LINQ查询:`Dim TimeGroups=From j In TotalTimeResults Group By x=New With{Key.Shift=j.Field(Of String)(“Shift”),Key.Name=j.Field(Of String)(“Name”),Key.Time=j.Field(Of Integer)(“Time”)}Into g=Group选择New With{.Shift=x.Shift、.Name=x.Name、.Time=x.Time、.total=g.Sum(Function(r)r.Field(Of Integer)(“Time”)}`是的,我想这对我有用。我可以看出我最初的想法哪里是错误的。我感谢你的帮助。