c#用datatable实现groupby数据统计

author author     2022-07-31     384

关键词:

1、用两层循环计算,前提条件是数据已经按分组的列排好序的。

DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[] { new DataColumn("name", typeof(string)),
                                        new DataColumn("sex", 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 dtResult = dt.Clone();
for (int i = 0; i < dt.Rows.Count; )
{
    DataRow dr = dtResult.NewRow();
    string name = dt.Rows[i]["name"].ToString();
    string sex = dt.Rows[i]["sex"].ToString();
    dr["name"] = name;
    dr["sex"] = sex;
    int score = 0;
    //内层也是循环同一个表,当遇到不同的name时跳出内层循环
    for (; i < dt.Rows.Count; )
    {
        if (name == dt.Rows[i]["name"].ToString()&&name == dt.Rows[i]["sex"].ToString())
        {
            score += Convert.ToInt32(dt.Rows[i]["score"]);
            dr["score"] = score;
            i++;
        }
        else
        {
            break;
        }
    }
    dtResult.Rows.Add(dr);

}

dtResult中的数据即是最终结果。 

2、 借助DataTable的Compute方法,DataTable中数据不用事先排好序。

DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[] { new DataColumn("name", typeof(string)),
                                         new DataColumn("sex", 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 dtResult = dt.Clone();
DataTable dtName = dt.DefaultView.ToTable(true, "name","sex");
for (int i = 0; i < dtName.Rows.Count; i++)
{
    DataRow[] rows = dt.Select("name=‘" + dtName.Rows[i][0] + "‘ and sex=‘" + dtName.Rows[i][1] + "‘");
    //temp用来存储筛选出来的数据
    DataTable temp = dtResult.Clone();
    foreach (DataRow row in rows)
    {
        temp.Rows.Add(row.ItemArray);
    }

    DataRow dr = dtResult.NewRow();
    dr[0] = dtName.Rows[i][0].ToString();
    dr[1] = temp.Compute("sum(score)", "");
    dtResult.Rows.Add(dr);

3、使用linq to DataTable group by实现

var query = from t in dt.AsEnumerable()
            group t by new { t1 = t.Field<string>("name"), t2 = t.Field<string>("sex") } into m
            select new
            {
                name = m.Key.t1,
                sex = m.Key.t2,
                score = m.Sum(n => n.Field<decimal>("score"))
            };
if (query.ToList().Count > 0)
{
    query.ToList().ForEach(q =>
    {
        Console.WriteLine(q.name + "," + q.sex + "," + q.score);
    });

C#如何将两个DataTable Row合并为一行

】C#如何将两个DataTableRow合并为一行【英文标题】:C#HowdoimergetwoDataTableRowintoonerow【发布时间】:2021-01-1001:10:00【问题描述】:我有一个如下所示的数据表,它是从数据库中填充的我怎样才能使结果如下所示抱歉我的解释不好,... 查看详情

想把datatable中的一列分组计算count(),用compute可以实现么?

dt.Compute("COUNT(*)","GROUPBYId");出错:语法错误:“BY”运算符后缺少操作数。求方法groupby的那个字段有重复的,我这需要去重。所以想用GROUPBY。参考技术Adt.Compute("COUNT(id)","true");true表示filter补充:Compute... 查看详情

c#在datatable中怎么筛选数据?

...段值为book的数据,然后把筛选出来的数据,赋给DataTableB实现:(1)方法一:通过RowFilter筛选实现DataViewview=newDataView();view.Table=A;view.RowFilter="itemType='book'";//itemType是A中的一个字段B=view.ToTable();(2)方法二:通过Select 查看详情

c#实现两个(datatable)数据合并

在C#代码中,要将这两个表拼接起来,也有很多比较“笨”的办法,就是例如循环获取数据一条条拼起来,此办法在数据量少、字段少的可以使用此办法,但在数据量大的情况下会影响性能,而且字段多的时候也需要写一... 查看详情

c#基础第五天-作业答案-用datatable制作名片集

1.DataTable实现DataTablePersonCard=newDataTable();//创建一个DataTableDataTablePersonCardCopy=newDataTable();PersonCard.Columns.Add("姓名");//添加列名称PersonCard.Columns.Add("年龄");//添加列年龄PersonCard.Columns.Add("性别 查看详情

如何在datatable中使用groupby进行分组统计

参考技术A在SQL中我们可以使用groupby来进行分组统计,如果数据在datatable中该如何使用groupby呢,下面的方法可以实现groupby,代码如下:DataTabledt=newDataTable("cart");DataColumndc1=newDataColumn("areaid",Type.GetType("System.String... 查看详情

关于c#中groupby如何实现多条件分组汇总

比如我得到了5个id,我想把这5条用groupby分组汇总,而查询只能写成WHERE(id='1')OR(id='2')OR(id='3')OR(id='4')我想写成查询那样,可以用WHERE(idIN(36,28,32,33,11,37,40,35))组合,如何把这种方式写在groupby中可能表达不清... 查看详情

[c#]datatable操作汇总(持续更新)

1、DataTable分组操作vargrow=dt.Select().GroupBy((row1)=>{returnnew{//分组的字段fieldA=row1["a"].ToString(),fieldB=row1["b"].ToString()};}).ToList();foreach(varitemingrow){stringaa=item.Key.fieldA;stringbb=it 查看详情

c#处理datatable重复数据

一个datatable里面假如有ABCD4列10W行数据要求C列所有行相同的数据只保留一行,其他的删除掉,给出一个算法10秒内处理完成你可以用HashSet<T>来存储已存在的行检索速度会快很多代码如下不知道你的机子什么配置我的机子Debug... 查看详情

关于c#中的datatable,不知道如何清空里面的数据

在C#中,用一个按钮,按下后就对DataTable添加相应的数据,然后在DataGridView里面添加。但每点一次按钮都会DataTable添加一行,用了clear()函数也不行,怎么办参考技术A清空数据new是最好方法,clear()会清空结构不是很可取,要是想D... 查看详情

c#datatable分组并统计

1,为什么不先在数据库分组统计完了再返回给C#呢?2,如果非要在DataTable执行统计,那么我能想到的至少有3种办法:A,遍历每一行并按条件统计--最通俗易懂但效率也最低B,利用Linq里的GroupBy方法C,利用DataTable的Compute方法参... 查看详情

c#单元格录入时,显示过滤的数据

...后把符合筛选条件的可以放到另外一个DataTable中。三.可实现显示过滤信息的其他方式有:实现过滤如Concat、Intersect、Exceptdistinct。 查看详情

求指导用c#借助npoi将excel导入mysql数据库(或者dataset、datatable)!!!!!

...l操作用oldb连接查询跟操作sql一样的,查询出来的是dataset数据集,然后再去mysql官网下载c#操作mysql的dll,导入后操作mysql和sqlsercer一样的。你把oldb查询的dataset数据集用mysqlapi插入到mysql就可以了追问我还是不太明白,能留个QQ吗... 查看详情

在c#中,如何实现对一个列表数据list,进行降序排序

...List的又一个对象有一个orderby的方法吧,用这个方法怎么实现排序呢? 查看详情

c#,datatable中对时间的过滤过滤

...是查不出来……求达人赐教!参考技术A比较时间可以在数据库比较或者取回数据后在程序比较,在数据库比较会更理想。用between是可以的,不过between前后的数据类型必须和数据本身都是date类型,串是没法between的,数字当日起... 查看详情

c#怎样才能实现客户端通过服务器端连接数据库服务器???

...实例都是通过客户端直接连接数据库,请问需要怎样才能实现客户端通过服务器端连接数据库服务器???实现逻辑:客户端------服务器sever-------数据库sever希望能够提供出示例。请帮忙提供出具体实例代码或下载地址。可以处理... 查看详情

求问c#如何将json字符串转为datatable求详细解答

...,定义一个实体类用newtonsoft.json转,datatable其实大多用于数据库出来的数据,一般情况用不到的,非要转为datatable也可以,new一个datatable出来,循环json里面的每一条数据,一条一条加进datatable集参考技术A需要引用newtonsoft.json这... 查看详情

c#实现xml与datatable互转

privatestringConvertDataTableToXML(DataTablexmlDS){MemoryStreamstream=null;XmlTextWriterwriter=null;try{stream=newMemoryStream();writer=newXmlTextWriter(stream,Encoding.Default);xmlDS.WriteXml(writer) 查看详情