怎么根据某个条件统计datatable表里的某一个字段的累加总和?最好说明白一点,谢谢,在线等 ..

caiin 2009-11-09 09:36:19
首先呢,是从一个文本文件里获取数据,然后存到datatable表里,记住数据库里面是没有的哦,因为今天的数据是不能加到数据库里的,所以只能读取到内存里,然后直接就在内存里进行统计的,有没有解决的方法....
我已经想了N天了,找了N天的答案了......
现在都没辙了.....
谢谢各位的帮助了....
我的分数不多了,希望各位不要嫌弃我分数给的太少,谢谢了.
...全文
1175 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
HDNGO 2009-11-09
  • 打赏
  • 举报
回复
            //定义表结构
DataTable table = new DataTable();
DataColumn c1 = new DataColumn("id");
DataColumn c2 = new DataColumn("cItem", System.Type.GetType("System.String"));
DataColumn c3 = new DataColumn("nMoney", System.Type.GetType("System.Int32"));
DataColumn c4 = new DataColumn("nCount", System.Type.GetType("System.Int32"));
//添加列
table.Columns.Add(c1);
table.Columns.Add(c2);
table.Columns.Add(c3);
table.Columns.Add(c4);
//构造行
DataRow r1 = table.NewRow();
r1[0] = "1";
r1[1] = "训练";
r1[2] = "100";
r1[3] = "1";
//构造行
DataRow r2 = table.NewRow();
r2[0] = "2";
r2[1] = "新手手册";
r2[2] = "300";
r2[3] = "2";
//构造行
DataRow r3 = table.NewRow();
r3[0] = "3";
r3[1] = "训练";
r3[2] = "500";
r3[3] = "2";
//构造行
DataRow r4 = table.NewRow();
r4[0] = "4";
r4[1] = "训练";
r4[2] = "120";
r4[3] = "1";

//添加行
table.Rows.Add(r1);
table.Rows.Add(r2);
table.Rows.Add(r3);
table.Rows.Add(r4);

var test = table.AsEnumerable();
var query =
from p in test
group p by p.Field<string>("cItem") into g
select new { item = g.Key, students = g };

foreach (var g in query)
{
Console.WriteLine("{0}的nMoney={1},nCount={2} ", g.item,
g.students.Sum(w => w.Field<int>("nMoney")),
g.students.Sum(w => w.Field<int>("nCount")));
}
caiin 2009-11-09
  • 打赏
  • 举报
回复
不好意思,分数不是很多,只好给你们平分了.....谢谢啦.
caiin 2009-11-09
  • 打赏
  • 举报
回复
好的,可以了,谢谢....
ljhcy99 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ljhcy99 的回复:]
引用 14 楼 caiin 的回复:
用sum时会出现这个错误....不知道是为什么?



[/Quote]

dt01.Columns.Add("cItem", System.Type.GetType("System.String"));
dt01.Columns.Add("nMoney", System.Type.GetType("System.Int32"));
dt01.Columns.Add("nCount", System.Type.GetType("System.Int32"));
//moneyObject = dt01.Compute("sum(nMoney)", "cItem='"+drItem["cItem"].ToString()+"'");

看看,
ljhcy99 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 caiin 的回复:]
用sum时会出现这个错误....不知道是为什么?
[/Quote]
nMoney的类型要设置为int32,


//moneyObject = dt01.Compute("sum(nMoney)", "cItem='"+drItem["cItem"].ToStrin()+"'");

看看,
caiin 2009-11-09
  • 打赏
  • 举报
回复
DataTable dt01 = new DataTable();
dt01.Columns.Add("id");
dt01.Columns.Add("cItem");
dt01.Columns.Add("nMoney");
dt01.Columns.Add("nCount");
dt01.Columns.Add("dDateTime");

DataRow dr = dt01.NewRow();//1
dr["id"] = "1";
dr["cItem"] = "新手训练";
dr["nMoney"] = "100";
dr["nCount"] = "1";
dr["dDateTime"] = "2009-11-02";

DataRow dr02 = dt01.NewRow();//2
dr02["id"] = "2";
dr02["cItem"] = "训练";
dr02["nMoney"] = "300";
dr02["nCount"] = "2";
dr02["dDateTime"] = "2009-11-02";

DataRow dr03 = dt01.NewRow();//3
dr03["id"] = "3";
dr03["cItem"] = "训练";
dr03["nMoney"] = "500";
dr03["nCount"] = "8";
dr03["dDateTime"] = "2009-11-02";

DataRow dr04 = dt01.NewRow();//4
dr04["id"] = "4";
dr04["cItem"] = "训练";
dr04["nMoney"] = "600";
dr04["nCount"] = "2";
dr04["dDateTime"] = "2009-11-02";

DataRow dr05 = dt01.NewRow();//5
dr05["id"] = "5";
dr05["cItem"] = "升级手册";
dr05["nMoney"] = "120";
dr05["nCount"] = "1";
dr05["dDateTime"] = "2009-01-02";

dt01.Rows.Add(dr);
dt01.Rows.Add(dr02);
dt01.Rows.Add(dr03);
dt01.Rows.Add(dr04);
dt01.Rows.Add(dr05);


//统计字段
foreach (DataRow drItem in tableview.Rows)
{
double moneyObject;
int countObject;
//moneyObject = dt01.Compute("sum(nMoney)", "cItem='"+drItem["cItem"]+"'");
//countObject = dt01.Compute("sum(nCount)", "cItem='" + drItem["cItem"] + "'");
moneyObject = Convert.ToDouble(dt01.Compute("sum(nMoney)", "cItem='训练'"));
countObject = Convert.ToInt32(dt01.Compute("sum(nCount)","cItem='训练'"));
}
caiin 2009-11-09
  • 打赏
  • 举报
回复
用sum时会出现这个错误....不知道是为什么?
caiin 2009-11-09
  • 打赏
  • 举报
回复
无效的聚合函数 Sum()和类型 String 的用法。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.DataException: 无效的聚合函数 Sum()和类型 String 的用法。

源错误:


行 80: //moneyObject = dt01.Compute("sum(nMoney)", "cItem='"+drItem["cItem"]+"'");
行 81: //countObject = dt01.Compute("sum(nCount)", "cItem='" + drItem["cItem"] + "'");
行 82: moneyObject = Convert.ToDouble(dt01.Compute("sum(nMoney)", "cItem='训练'"));
行 83: countObject = Convert.ToInt32(dt01.Compute("sum(nCount)","cItem='训练'"));
行 84: }

ljhcy99 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 caiin 的回复:]
关键是还是有点不懂啊,sum是复合函数,用时老提示异常问题.....老实例给个参考下...谢谢..
[/Quote]
把你的代码贴出来,看看,
你求和的那个列需要设置数据类型的
caiin 2009-11-09
  • 打赏
  • 举报
回复
关键是还是有点不懂啊,sum是复合函数,用时老提示异常问题.....老实例给个参考下...谢谢..
ljhcy99 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 caiin 的回复:]
id  cItem  nMoney  nCount
1    训练  100    1
2 新手手册 300    2
3 训练   500    2
4 训练   120    1
要根据cItem来统计nMoney和nCount的累加和
结果:训练的nMoney=720,nCount=4
    新手手册的nMoney=300,nCount=2
[/Quote]


/*
id cItem nMoney nCount
1 训练  100    1
2 新手手册 300    2
3 训练   500    2
4 训练   120    1
要根据cItem来统计nMoney和nCount的累加和
结果:训练的nMoney=720,nCount=4
新手手册的nMoney=300,nCount=2
*/
//定义表结构
DataTable table = new DataTable();
DataColumn c1 = new DataColumn("id");
DataColumn c2 = new DataColumn("cItem", System.Type.GetType("System.String"));
DataColumn c3 = new DataColumn("nMoney", System.Type.GetType("System.Int32"));
DataColumn c4 = new DataColumn("nCount", System.Type.GetType("System.Int32"));
//添加列
table.Columns.Add(c1);
table.Columns.Add(c2);
table.Columns.Add(c3);
table.Columns.Add(c4);
//构造行
DataRow r1 = table.NewRow();
r1[0] = "1";
r1[1] = "训练";
r1[2] = "100";
r1[3] = "1";
//构造行
DataRow r2 = table.NewRow();
r2[0] = "2";
r2[1] = "新手手册";
r2[2] = "300";
r2[3] = "2";
//构造行
DataRow r3 = table.NewRow();
r3[0] = "3";
r3[1] = "训练";
r3[2] = "500";
r3[3] = "2";
//构造行
DataRow r4 = table.NewRow();
r4[0] = "4";
r4[1] = "训练";
r4[2] = "120";
r4[3] = "1";

//添加行
table.Rows.Add(r1);
table.Rows.Add(r2);
table.Rows.Add(r3);
table.Rows.Add(r4);
//计算
//训练的nMoney=720,nCount=4
int nMoney1 = Convert.ToInt32(table.Compute("sum(nMoney)", "cItem='训练'"));
int nCount1 = Convert.ToInt32(table.Compute("sum(nCount)", "cItem='训练'"));

//新手手册的nMoney=720,nCount=4
int nMoney2 = Convert.ToInt32(table.Compute("sum(nMoney)", "cItem='新手手册'"));
int nCount2 = Convert.ToInt32(table.Compute("sum(nCount)", "cItem='新手手册'"));

jenny0810 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mbh0210 的回复:]
http://msdn.microsoft.com/en-us/library/system.data.datatable.compute.aspx
[/Quote]
学习
yangqizhong 2009-11-09
  • 打赏
  • 举报
回复
就用Compute就可以,而且在程序里处理的代码也写出来了
ybblack001 2009-11-09
  • 打赏
  • 举报
回复
我觉得已经可以结贴了
caiin 2009-11-09
  • 打赏
  • 举报
回复
id cItem nMoney nCount
1 训练  100    1
2 新手手册 300    2
3 训练   500    2
4 训练   120    1
要根据cItem来统计nMoney和nCount的累加和
结果:训练的nMoney=720,nCount=4
新手手册的nMoney=300,nCount=2
mbh0210 2009-11-09
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/en-us/library/system.data.datatable.compute.aspx
mbh0210 2009-11-09
  • 打赏
  • 举报
回复
dataTable有Compute方法的
jiangshun 2009-11-09
  • 打赏
  • 举报
回复
貌似你说的太笼统了,能给具体的数据吗

foreach或者for循环就够了
ybblack001 2009-11-09
  • 打赏
  • 举报
回复
int sum = 0;
foreach(DataRow dr in dt.Rows)
{
sum += int.Prase(dr["累加字段"].ToString());
}
ljhcy99 2009-11-09
  • 打赏
  • 举报
回复
用DataTable的Compute 方法啊。
比如 定义了一个 Datatable table,
有 Total,id 字段。
下面的代码将id=5的全部累加起来。

object sumObject;
sumObject = table.Compute("Sum(Total)", "ID = 5");

62,244

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧