datatable group by

写程序的应该都知道SQL中group by的作用,但是有时候可能会遇到无法在SQL中group by的情况,我刚好就碰到了这样的情况。于是就尝试了下在DataTable中对数据进行分组计算的方法,有两种解决办法。
      1.用两层循环计算,前提条件是数据必须是要按分组的列排好序的,如下:

            DataTable dt = new DataTable();
            dt.Columns.AddRange(new DataColumn[] { new DataColumn("name", typeof(string)),
                                                   new DataColumn("score", typeof(int)) });

            dt.Rows.Add(new object[] { "张三", 1 });
            dt.Rows.Add(new object[] { "张三", 4 });
            dt.Rows.Add(new object[] { "李四", 100 });
            dt.Rows.Add(new object[] { "李四", 90 });
            dt.Rows.Add(new object[] { "王五", 77 });

            DataTable dtLwolf = dt.Clone();

            for (int i = 0; i < dt.Rows.Count; )
            {
                DataRow dr = dtLwolf.NewRow();
                string name = dt.Rows[i]["name"].ToString();
                dr["name"] = name;

                int score = 0;
        //内层也是循环同一个表,当遇到不同的name时跳出内层循环
                for (; i < dt.Rows.Count; )
                {
                    if (name == dt.Rows[i]["name"].ToString())
                    {
                        score += Convert.ToInt32(dt.Rows[i]["score"]);
                        dr["score"] = score;
                        i++;
                    }
                    else
                    {
                        break;
                    }
                }
                dtLwolf.Rows.Add(dr);
            }

 

dtLwolf中的数据即是最终结果

      2.借助DataTable的Compute方法,DataTable中数据不用事先排好序。
        下面代码中的dt是跟前面的是一样的

            DataTable dtName = dt.DefaultView.ToTable(true, "name");
            for (int i = 0; i < dtName.Rows.Count; i++)
            {
                DataRow[] rows = dt.Select("name='" + dtName.Rows[i][0] + "'");
                //temp用来存储筛选出来的数据
                DataTable temp = dtLwolf.Clone();
                foreach (DataRow row in rows)
                {
                    temp.Rows.Add(row.ItemArray);
                }

                DataRow dr = dtLwolf.NewRow();
                dr[0] = dtName.Rows[i][0].ToString();
                dr[1] = temp.Compute("sum(score)", "");
                dtLwolf.Rows.Add(dr);
            }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DataTable 中,可以使用 Group By 子句对数据进行分组操作。Group By 子句通常与集合函数(如 SUM、COUNT、AVG 等)一起使用,以便对每个组中的数据进行聚合。 下面是一个示例代码,它演示了如何在 DataTable 中使用 Group By 子句: ```csharp // 假设有一个 DataTable 对象 dt,其中包含两个列:Name 和 Age var query = from row in dt.AsEnumerable() group row by row.Field<string>("Name") into g select new { Name = g.Key, Count = g.Count(), AvgAge = g.Average(row => row.Field<int>("Age")) }; ``` 在这个示例中,我们首先使用 `AsEnumerable()` 方法将 DataTable 转换为一个可枚举的序列。然后使用 `group by` 子句按照 `Name` 列对数据进行分组。分组后,我们使用 `select` 子句将每个分组的结果转换为一个新的匿名类型对象,该对象包含分组的键 `Name`,该组中的行数 `Count`,以及该组中所有行 `Age` 列的平均值 `AvgAge`。 需要注意的是,`group by` 子句可以按照多个列进行分组,例如: ```csharp var query = from row in dt.AsEnumerable() group row by new { Name = row.Field<string>("Name"), City = row.Field<string>("City") } into g select new { Name = g.Key.Name, City = g.Key.City, Count = g.Count(), AvgAge = g.Average(row => row.Field<int>("Age")) }; ``` 在这个示例中,我们使用一个匿名类型作为分组的键,该类型包含 `Name` 和 `City` 两个属性。分组后,我们根据这两个属性将数据分成多个组,并计算每个组的行数和平均年龄。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值