【问题标题】:DataTable sum duplicate rows数据表总和重复行
【发布时间】:2015-07-19 18:07:03
【问题描述】:

我有 DataTable,它可以有半重复的行。在图片示例中,两个突出显示的行具有所有相同的值,但“金额”列中的金额。我需要识别这些行并将金额相加。数据来自文本文件,没有唯一标识行的键。

我看了一些类似这样的答案 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 表时如何获得成功结果的示例。

【问题讨论】:

  • 你需要做GroupBy一些功能,比如日期1、列1等
  • 那么这里有什么问题和/或问题@AidaM 查询是否产生正确的结果..?此外,如果您正在从文本文件加载/读取数据.. 这实际上很容易做到.. 如果您从 Sql Query 运行,您是否熟悉名为 Control Break Processing google 如何使用 GroupBy
  • 我刚刚在 SQL 中测试了查询,但我的应用程序数据既没有进入也没有进入 SQL。我通过将输入数据保存到数据表来处理输入数据,处理后将导出为 Excel 文件。我需要执行 SQL 查询示例使用 LINQ 或其他方式执行的操作。 @MethodMan
  • 我认为创建一个模仿文件布局的类将是一个很好的开始。然后通过文件检查 2 个数据字段将所有文本数据加载到字符串 [] 循环中。如果它们相同,则捕获/计算金额..当值发生变化时,您将获得总计并使用下一个字段日期值作为您的新值,以在循环中检查它们是否等于前一个..这只是一个你可以这样做..控制中断处理..
  • 是的,创建一个类文件来匹配输入字段将是一种方法。在此过程之前,已经有很少的更正(“中断”)过程可以修复其他列数据。此外,“文件检查”需要在 10 个列字段上,而不是您提到的 2 个字段上。如果其他人相同,则必须将两者相加。 @MethodMan

标签: c# linq datatable


【解决方案1】:

这就是使用 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}
      );

如果您需要将结果作为数据表,您可以使用众多 List To Datatable 扩展方法中的一种。只需在上述查询的末尾添加“.ToList().AsDataTable()”即可将其恢复到数据表中。

【讨论】:

  • 这个线程中有一些示例扩展方法:stackoverflow.com/questions/9937573/…
  • 感谢您的帮助,效果很好!我考虑将其转换回 DataTable 但不必这样做;相反,我遍历了每个结果行并生成了我的最终输出 Excel 文件。 @罗伯特-麦基
猜你喜欢
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 2022-07-21
  • 2013-08-06
  • 2020-08-12
  • 2017-05-31
相关资源
最近更新 更多