两种方式:

第一种,Linq

void Main()
{
var dt=new DataTable();
dt.Columns.Add("medicID");
dt.Columns.Add("price");
dt.Columns.Add("num",typeof(int));
dt.Columns.Add("unit");
dt.Rows.Add("0001","1.2",10,"盒");
dt.Rows.Add("0001","1.2",15,"盒");
dt.Rows.Add("0002","14",15,"支");
dt.Rows.Add("0003","10",10,"盒");
dt.Rows.Add("0002","14",10,"盒"); var query=dt.AsEnumerable()
.GroupBy(d=>new {medicID=d.Field<string>("medicID"),price=d.Field<string>("price"),unit=d.Field<string>("unit")})
.Select(g=>new{
medicID=g.Key.medicID,
price=g.Key.price,
num=g.Sum(d=>d.Field<int>("num")),
unit=g.Key.unit
}); }

  

第二种,Datatable

        public DataTable dtgourpsum(DataTable dt) {
//初始化列
DataRow[] rows = dt.Select(null, "ProductCode");
int length = rows.Length;
string ProductCode = null;
for (int i = dt.Rows.Count - ; i >= ; i--)
{
//DataRow row = rows[i];
if (dt.Rows[i]["ProductCode"].ToString() != ProductCode)//如果1个列中有不同的,则为新的分组,重新记录1个列的值到临时变量
{
ProductCode = dt.Rows[i]["ProductCode"].ToString();
}
else
{
dt.Rows[i]["OerderNumber"] = Convert.ToInt32(dt.Rows[i + ]["OerderNumber"].ToString()) + Convert.ToInt32(dt.Rows[i]["OerderNumber"].ToString());//将上一个行的OerderNumber列和当前行的OerderNumber相加,记录到当前行中。
dt.Rows.RemoveAt(i+);//将上一行从原来的DataTable中移除。
}
}
return dt;
}

最快的做法不是Linq,而是先排序后相加并删除后面相同的行来处理,Linq在这里将非常低效,推荐使用第二种方法。

转自CSDN,原文链接:https://bbs.csdn.net/topics/390063982

DataTable行分组,并sum求和的更多相关文章

  1. 从sum()求和引发的思考

    sum()求和是一个非常简单的函数,以前我的写法是这样,我想大部分和我一样刚开始学习JS的同学写出来的也会是这样. function sum() { var total=null; for(var i ...

  2. C#中DataTable行转列示例

    将下面表(1)格式的数据转换为表(2)格式的数据.很明显,这是一个行转列的要求,本想在数据库中行转列,因为在数据库中行转列是比较简单的,方法可以参考本站SQLServer中(行列转换)行转列及列转行且 ...

  3. 如何使用linq操作datatable进行分组

    使用微软.net的孩子们应该都知道linq吧,要知道linq可是其他高级语言没有的技术,比如php,java等等,但是起初我对linq的认识只是停留在对 list<> 的泛型集合进行操作, ...

  4. c# DataTable行转列

    /// <summary> /// datatable行转列 /// </summary> /// <param name="dtSrc">来源 ...

  5. postgresql高级应用之行转列&汇总求和

    postgresql高级应用之行转列&汇总求和 轉載請注名出處 https://www.cnblogs.com/funnyzpc/p/14732165.html 前言 节前公司业务方需要做一個 ...

  6. RDLC报表系列--------行分组报表

    报表分组开发步骤: 先看总体效果:如图 下面就做个看看... 1.先将数据处理成如下结构 如图 2.创建数据集DataSet.xsd,创建表->右键选择添加数据表->添加行(ctrl+L ...

  7. DataTable行转列

    /// <summary> /// DataTable行转列 /// </summary> /// <param name="dtable">需 ...

  8. RDLC报表系列(二) 行分组

    接上一篇文章的内容,今天来说的是行分组.还是打开demo1.rdlc界面,拖入一个文本框和表 1.在表中随便选择一个字段,不然在添加行组的时候不会自动提示.我这里是选择的Dept 2.在下面的行组中右 ...

  9. sum() 求和用法

    def func(*args): # sum = 0 # for el in args: # sum += el # return sum return sum(args) # sum() 求和 de ...

随机推荐

  1. java——什么是浅表副本

    ArrayList.clone(),hashtable.clone()方法返回此ArrayList的浅表副本(不复制这些元素本身),那么什么是浅表副本? 一个集合的浅度拷贝意味着只拷贝集合中的元素,不 ...

  2. tornado+websocket+mongodb实现在线视屏文字聊天

    最近学了tornado和mongo,所以结合websocket 实现一个聊天功能,从而加深一下相关知识点的印象 1.websocket概览 webscoket是一种全双工通信模式的协议,客户端连接服务 ...

  3. python-web自动化:下拉列表操作

    非select/option元素: 1.触发下拉列表出现 2.等待下拉列表中的元素出现,然后进行选择元素即可. select/option元素: 下拉框操作-Select类selenium提供Sele ...

  4. Centos7上安装java

    1.默认情况下,系统安装的有jdk1.8,但是使用javac测试时会不识别这个命令,   意味着,java还是未安装好. 2.把java升级即可,此时java已经可用. yum -y install ...

  5. JAVA 数组遍历

    一.遍历List 1.增强for循环 String[] arr = new String[] {"xx","yy","zz"}; for(S ...

  6. API手册(2017)

    本页存放内容: API手册. 少量教程 [旧的工具页面] (是一些旧的页面.不放在外面了,这里做个索引) http://www.cnblogs.com/qq21270/p/3538677.html 常 ...

  7. C++实现根据路径读取文件内容

    已知文件路径,用C++实现读取对应文件的内容,代码如下: bool LoadShaderStr(const char* szShaderPath,string& strShaderStr) { ...

  8. 记数据库数据文件损坏恢复ORA-00376+ORA-01110

    现象:业务平台无法登陆,日志报错为ORACLE的错误. 查看oracle日志的报错, ORA-00376: file 5 cannot be read at this time ORA-01110: ...

  9. Intellij IDEA常用快捷键介绍 Intellij IDEA快捷键大全汇总

    其他的快捷键还有很多,象Ctrl+G(跳转到指定行).Ctrl+F4(关闭当前编辑页面).Ctrl+F(搜索)等等,这些快捷键由于是各个编辑器都会提供的,而且定义的键位也都差不多,就没什么可说的了: ...

  10. ServerSocket详解及线程阻塞_03

    ServerSocket详解构造方法ServerSocket()ServerSocket(int port)ServerSocket(int port ,int backlog)serverSocke ...