DataTable 求和重复行
DataTable sum duplicate rows
我有 DataTable,它可以有半重复的行。在图片示例中,两个突出显示的行具有完全相同的值,但 'Amount' 列中的金额。我需要识别这些行并计算总金额 $。数据来自文本文件,没有唯一标识行的键。
我看了一些像这样的答案
Best way to remove duplicate entries from a data table 但在我的例子中,不仅需要匹配一列,还需要匹配 10 列。
我也尝试了不同的 LINQ 查询,但没有成功。
这是执行任务的 SQL 查询:
SELECT [Date1],[Date2],[Date3]
,SUM([Amount1]) as Summary1
,SUM([Amount2]) as Summary2
,SUM([Amount3]) as Summary3
,[col1],[col2],[Rate1],[Rate2],[Rate3],[product],[comment]
FROM [Table]
group by [Date1],[Date2],[Date3],[col1],[col2],[Rate1],[Rate2],[Rate3],[product],[comment]
编辑:澄清一下,SQL 查询是一个示例,说明如果我正在查询 SQL [=31,我将如何获得成功的结果=].
这是使用 EF 的方式:
var result=db.Table
.GroupBy(r=>new {
r.Date1,
r.Date2,
r.Date3,
r.col1,
r.col2,
r.Rate1,
r.Rate2,
r.Rate3,
r.product,
r.comment},
p=>new {
p.Amount1,
p.Amount2,
p.Amount3},
(key,vals)=>new {
key.Date1,
key.Date2,
key.Date3,
Amount1=vals.Sum(v=>v.Amount1),
Amount2=vals.Sum(v=>v.Amount2),
Amount3=vals.Sum(v=>v.Amount3),
key.col1,
key.col2,
key.Rate1,
key.Rate2,
key.Rate3,
key.product,
key.comments}
);
如果您实际上是从数据表中进行的,请稍作修改:
var result=dt.AsEnumerable()
.GroupBy(d=>new {
Date1=d.Field<datetime>("Date1"),
Date2=d.Field<datetime>("Date2"),
Date3=d.Field<datetime>("Date3"),
col1=d.Field<string>("col1"),
col2=d.Field<string>("col2"),
Rate1=d.Field<decimal>("Rate1"),
Rate2=d.Field<decimal>("Rate2"),
Rate3=d.Field<decimal>("Rate3"),
product=d.Field<string>("product"),
comments=d.Field<string>("comments")},
p=>new {
Amount1=p.Field<decimal>("Amount1"),
Amount2=p.Field<decimal>("Amount2"),
Amount3=p.Field<decimal>("Amount3")},
(key,vals)=>new {
key.Date1,
key.Date2,
key.Date3,
Amount1=vals.Sum(v=>v.Amount1),
Amount2=vals.Sum(v=>v.Amount2),
Amount3=vals.Sum(v=>v.Amount3),
key.col1,
key.col2,
key.Rate1,
key.Rate2,
key.Rate3,
key.product,
key.comments}
);
如果您需要将结果作为数据表,您可以使用其中一种列表到数据表扩展方法。只需在上述查询的末尾添加“.ToList().AsDataTable()”即可将其返回到数据表中。
我有 DataTable,它可以有半重复的行。在图片示例中,两个突出显示的行具有完全相同的值,但 'Amount' 列中的金额。我需要识别这些行并计算总金额 $。数据来自文本文件,没有唯一标识行的键。
我看了一些像这样的答案 Best way to remove duplicate entries from a data table 但在我的例子中,不仅需要匹配一列,还需要匹配 10 列。
我也尝试了不同的 LINQ 查询,但没有成功。
这是执行任务的 SQL 查询:
SELECT [Date1],[Date2],[Date3]
,SUM([Amount1]) as Summary1
,SUM([Amount2]) as Summary2
,SUM([Amount3]) as Summary3
,[col1],[col2],[Rate1],[Rate2],[Rate3],[product],[comment]
FROM [Table]
group by [Date1],[Date2],[Date3],[col1],[col2],[Rate1],[Rate2],[Rate3],[product],[comment]
编辑:澄清一下,SQL 查询是一个示例,说明如果我正在查询 SQL [=31,我将如何获得成功的结果=].
这是使用 EF 的方式:
var result=db.Table
.GroupBy(r=>new {
r.Date1,
r.Date2,
r.Date3,
r.col1,
r.col2,
r.Rate1,
r.Rate2,
r.Rate3,
r.product,
r.comment},
p=>new {
p.Amount1,
p.Amount2,
p.Amount3},
(key,vals)=>new {
key.Date1,
key.Date2,
key.Date3,
Amount1=vals.Sum(v=>v.Amount1),
Amount2=vals.Sum(v=>v.Amount2),
Amount3=vals.Sum(v=>v.Amount3),
key.col1,
key.col2,
key.Rate1,
key.Rate2,
key.Rate3,
key.product,
key.comments}
);
如果您实际上是从数据表中进行的,请稍作修改:
var result=dt.AsEnumerable()
.GroupBy(d=>new {
Date1=d.Field<datetime>("Date1"),
Date2=d.Field<datetime>("Date2"),
Date3=d.Field<datetime>("Date3"),
col1=d.Field<string>("col1"),
col2=d.Field<string>("col2"),
Rate1=d.Field<decimal>("Rate1"),
Rate2=d.Field<decimal>("Rate2"),
Rate3=d.Field<decimal>("Rate3"),
product=d.Field<string>("product"),
comments=d.Field<string>("comments")},
p=>new {
Amount1=p.Field<decimal>("Amount1"),
Amount2=p.Field<decimal>("Amount2"),
Amount3=p.Field<decimal>("Amount3")},
(key,vals)=>new {
key.Date1,
key.Date2,
key.Date3,
Amount1=vals.Sum(v=>v.Amount1),
Amount2=vals.Sum(v=>v.Amount2),
Amount3=vals.Sum(v=>v.Amount3),
key.col1,
key.col2,
key.Rate1,
key.Rate2,
key.Rate3,
key.product,
key.comments}
);
如果您需要将结果作为数据表,您可以使用其中一种列表到数据表扩展方法。只需在上述查询的末尾添加“.ToList().AsDataTable()”即可将其返回到数据表中。