如果找到重复行,则增加数据表中的列值

时间:2016-08-16 16:34:16

标签: vb.net datatable

我试图在数据表中总结一些数据,我试图做的是总结找到的重复行的总数。

我的数据表看起来像这样。

|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()

然而,从这里开始,我不确定,有没有人遇到过这样的情景,能够指出我正确的方向。

2 个答案:

答案 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”,它还会计算源/组行数,并按总数排序。

enter image description here

答案 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