【问题标题】:GROUP BY in datatable on two columns with sum of third column using LINQ使用LINQ在数据表中对两列进行GROUP BY,第三列的总和
【发布时间】:2014-02-22 15:56:32
【问题描述】:

我正在搜索输入和输出数据表如下所示的 LINQ 查询 -

Name    Code    count
-------------------------
User1   q1  2

user1   q2  2

user2   q2  1

user2   q3  3

user1   q1  2



Name    Code    Count
-----------------------
User1  |    q1   |  4
User1  |    q2   |  2
User1  |    q3   |  0
User2  |    q1   |  0
User2  |    q2   |  1
User2  |    q3   |  3

即我想要每个名称的不同代码集的计数总和,在结果表中,它显示 (user1, q3,0) 因为在输入数据表中没有 user1 的 q3 记录,请在这方面提供帮助,再次感谢

【问题讨论】:

    标签: c# linq datatable


    【解决方案1】:

    这应该可行:

    var query = table.AsEnumerable()
        .GroupBy(row => new { Name = row.Field<string>("Name"), Code = row.Field<string>("Code") });
    
    var table2 = table.Clone(); // empty table with same schema
    foreach (var x in query)
    {
        string name = x.Key.Name;
        string code = x.Key.Code;
        int count = x.Sum(r => r.Field<int>("Count"));
        table2.Rows.Add(x.Key.Name, x.Key.Code, count);
    }
    

    编辑:如果您想修改原始表并对每个名称代码组的计数求和,请使用这种使用Dictionary 作为查找的方法:

    var nameCodeCountLookup = table.AsEnumerable()
        .GroupBy(row => new { Name = row.Field<string>("Name"), Code = row.Field<string>("Code") })
        .ToDictionary(ncGrp => ncGrp.Key, ncGrp => ncGrp.Sum(r => r.Field<int>("Count")));
    foreach (DataRow row in table.Rows)
    {
        string Name = row.Field<string>("Name");
        string Code = row.Field<string>("Code");
        row.SetField("Count", nameCodeCountLookup[new { Name, Code }]);
    }
    

    但是,我不知道为什么您的结果表包含这一行:

    User1  |    q3   |  0
    

    原表中没有名称-代码组合User1+q3。

    【讨论】:

    • 嗨蒂姆,感谢您的回复,但第一个代码抛出错误 - 绑定到 table2 时“指定的演员表无效”
    • @user3240893:那么Count 列不是int 列,而是(我猜)一个字符串列。改变它。
    • 用户1 | q3 | 0;我想显示输入表中所有不同代码的计数(可以为 0)
    • @user3240893:请注意,我已经编辑了我的第一种方法。我认为这要简单得多。根据您最后的评论,我稍后再看看。
    • Count = codeGroup.Sum(r => Convert.ToInt64(r["code"])),我使用了这个,现在它显示结果但不是必需的。
    【解决方案2】:

    我想这就是你要找的东西:

      var result =
                new DataTable().Rows.Cast<DataRow>()
                    .Select(p => new {User = p[0], Q = p[1], Value = (double) p[2]})
                    .GroupBy(p => new {p.User, p.Q})
                    .Select(p => new {User = p.Key.User, Q = p.Key.Q, Total = p.Sum(x => x.Value)})
                    .ToList();
    

    或几乎相同,但你也可以这样做:

       var result =
                new DataTable().Rows.Cast<DataRow>()
                    .Select(p => new 
                              {
                                  User = p.Field<string>("column1Name"), 
                                  Q = p.Field<string>("column2Name"), 
                                  Value = p.Field<double>("column3Name")
                              })
                    .GroupBy(p => new {p.User, p.Q})
                    .Select(p => new {User = p.Key.User, Q = p.Key.Q, Total = p.Sum(x => x.Value)})
                    .ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 2012-08-29
      • 1970-01-01
      • 2014-02-19
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多