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”)}`是的,我想这对我有用。我可以看出我最初的想法哪里是错误的。我感谢你的帮助。