我试图在数据表中总结一些数据,我试图做的是总结找到的重复行的总数。
我的数据表看起来像这样。
|ForeName|SurName|Quantity|
|Dave |Smith | 10000 |
|Dave |Smith | 20000 |
|Dave |Smith | 30000 |
|John |Peacock| 10000 |
我想总结一下这个数据。
|ForeName|SurName|Quantity|
|Dave |Smith | 60000 |
|John |Peacock| 10000 |
目前我正在数据表中搜索重复项
Dim duplicates = From rows In dt.AsEnumerable().GroupBy(Function(r) New With {Key .a = r("ForeName"), Key .b = r("SurName")}).Where(Function(gr) gr.Count() > 1).ToList()
然而,从这里开始,我不确定,有没有人遇到过这样的情景,能够指出我正确的方向。
答案 0 :(得分:1)
按名称或ID对行进行分组;使用名称/ ID作为新的anon类型中的标识符,使用Count / Total或Quantity属性来收集数量的Sum
:
Dim duplicates = myDT.AsEnumerable().
GroupBy(Function(r) New With {Key .Item = r.Field(Of String)("Name")}).
Select(Function(g) New With {Key .Name = g.Key.Item,
Key .Count = g.Count,
Key .Total = g.Sum(Function(s) s.Field(Of Int32)("Quantity"))}).
OrderByDescending(Function(j) j.Total).
ToList()
对于“fun”,它还会计算源/组行数,并按总数排序。
答案 1 :(得分:1)
如果你不介意输出是匿名类型而不是DataRows,你可以使用这样的LINQ查询:
Dim summary =
From r In dt.AsEnumerable()
Group By ForeName = r.Field(Of String)("ForeName"), SurName = r.Field(Of String)("SurName") Into Group
Select ForeName, SurName, Quantity = Group.Sum(Function(x) x.Field(Of Integer)("Quantity"))
ForeName | SurName | Quantity ---------+---------+--------- Dave | Smith | 60000 John | Peacock | 10000
如果需要,您可以使用this question的答案将其转换回DataTable。
添加计数,就像Plutonix's answer一样,只是意味着将Group.Count
添加到Select
子句中:
Dim summary =
From r In dt.AsEnumerable()
Group By ForeName = r.Field(Of String)("ForeName"), SurName = r.Field(Of String)("SurName") Into Group
Select ForeName, SurName, Group.Count, Quantity = Group.Sum(Function(x) x.Field(Of Integer)("Quantity"))
ForeName | SurName | Count | Quantity ---------+---------+-------+--------- Dave | Smith | 3 | 60000 John | Peacock | 1 | 10000