【问题标题】:Get SUM of DataTable column获取 DataTable 列的 SUM
【发布时间】:2016-12-26 10:30:30
【问题描述】:

我在 DataTable 中有以下值

Affiliate Name | Call
---------------|-----
A              |   2
B              |   1  
B              |   0
A              |   3

如何根据Affiliate Name 'A' 检索Call 的总计数。在上面的例子中,它应该返回 5。

foreach (DataRow row in dt.Rows)
{
    string CallsOffered = //Get count
}

【问题讨论】:

  • var groupedData = from b in dataTable.AsEnumerable() group b by b.Field("Affiliate Name") into g select new { Affiliate Name = g.Key, Count = g. Count(), Call= g.Sum(x => x.Field("Call")) };
  • @Daniel 这不是一个简单的 SUM。Call 的总和取决于另一列的值
  • @Daniel - 这个关于分组结果总和的问题,结果必须返回总和的集合

标签: c# linq datatable ado.net


【解决方案1】:

你可以使用DataTable.Compute方法

var sumOfA = dt.Compute("Sum(Call)", "[Affiliate Name] = 'A'");

或者使用 LINQ

var sumOfA = dt.AsEnumerable()
               .Where(dr => dr.Field<string>("Affiliate Name").Equals("A"))
               .Sum(dr => dr.Field<int>("Call"));

如果您想获得所有 Affiliate Name 值的调用总和,请使用匿名类型的 LINQ

var results = dt.AsEnumerable()
                .GroupBy(dr => dr.Field<string>("Affiliate Name"))
                .Select((group, dr) => new 
                {
                    AffiliateName = group.Key,
                   CallsCount = group.Sum(dr.Field<int>("Call")))
                });

foreach(var result in results)
{
    // Use results
    Console.WriteLine($"{result.AffiliateName}: {result.CallsCount}");
}

【讨论】:

  • 我更喜欢 LINQ。谢谢:)
  • 这并不重要,但您忘记了 Console.WriteLine 末尾的报价
【解决方案2】:

你可以使用

    int CallsOffered=0;
    foreach (DataRow row in dt.Rows)
    {
      if(row["Affiliate_Name"].ToString()=="A")
        CallsOffered += int.Parse(row["Call"].ToString());
    }

【讨论】:

    【解决方案3】:

    随便用

    object sumObject = table.Compute("Sum(Call)", "Affiliate_Name = 'A'");
    

    【讨论】:

      【解决方案4】:
      // with this code you can use linq features in all other steps
      // add each column you need them to use them with linq  
      var records = dt.AsEnumerable().Select(row =>
      new
      {
          Affiliate = row.Field<string>("Affiliate(col name)"),
          Call = Convert.ToInt32(row.Field<int>("Call(col name)"))
      });
      int count = records.Where(q => q.Affiliate == "A").Sum(q => q.Call);
      

      【讨论】:

        猜你喜欢
        • 2011-12-17
        • 2023-01-19
        • 2019-01-07
        • 2021-10-16
        • 2011-11-20
        • 1970-01-01
        • 1970-01-01
        • 2020-10-13
        • 1970-01-01
        相关资源
        最近更新 更多