DataTable汇总问题。十万火急!!!急急急,当天有结果当天给分!

richie8398 2008-07-03 09:38:47
现在需要绑定一个gridview,其中,datatable起初得数据如下:
productid bingrade quantity
111 a 20
111 a 10
111 b 30
222 c 50
222 c 40


现在相对datatable进行列汇总,其中,productid和bingrade必须同时相同时,才能对quantity进行累加。显示效果如下:

productid bingrade quantity
111 a 30
111 b 30
222 c 90


请高手帮我看看,今天公司等着要呢!Thank you!
...全文
747 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxhouyi010101 2009-04-23
  • 打赏
  • 举报
回复
楼主,我觉得你这句存在问题,虽然可以做到通过排序达到重复的记录成为相邻的行,但是如果不是相邻的行怎么办呢?
if (dt1.Rows[i][0].ToString().Equals(dt1.Rows[i + 1][0].ToString()) && dt1.Rows[i][1].ToString().Equals(dt1.Rows[i + 1][1].ToString()))

有点儿死板啊

还是这个方法可行
DataTable dt = new DataTable();
dt.Columns.Add("productid");
dt.Columns.Add("bingrade");
dt.Columns.Add("quantity");
dt.Rows.Add(new object[] { "111", "a", "20" });
dt.Rows.Add(new object[] { "111", "a", "10" });
dt.Rows.Add(new object[] { "111", "b", "30" });
dt.Rows.Add(new object[] { "222", "c", "50" });
dt.Rows.Add(new object[] { "222", "c", "40" });
DataTable groupTable = dt.Clone();
groupTable.PrimaryKey = new DataColumn[]{groupTable.Columns[0],groupTable.Columns[1]};
foreach (DataRow dataRow in dt.Rows)
{
DataRow groupRow = groupTable.Rows.Find(new object[] { dataRow["productid"], dataRow["bingrade"] });
if (groupRow == null)
{
groupTable.Rows.Add(dataRow.ItemArray);
}
else
{
groupRow["quantity"] = Convert.ToInt32(groupRow["quantity"]) + Convert.ToInt32(dataRow["quantity"]);
}
}
GridView1.DataSource = groupTable;
GridView1.DataBind();

richie8398 2008-07-04
  • 打赏
  • 举报
回复
问题已经解决了,受了大家的启发,自己换了一种写法。先将代码贴给大家做个参考,有什么好的写法及时回帖也可发邮件:mqsyrichie@yahoo.com.cn
DataRow dr1 = dt1.NewRow();
dr1[0] = " ";
dr1[1] = " ";
dr1[2] = " ";
dr1[3] = " ";
dr1[4] = " ";
dr1[5] = " ";
dr1[6] = " ";
dr1[7] = " ";
dr1[8] = " ";
dt1.Rows.Add(dr1);
从数据库查询出来的记录放在dt1中,在最后我又加了一个空行。(为了下面的for循环溢出)



DataTable newdt = new DataTable();
newdt.Columns.Add("producitid", typeof(String));
newdt.Columns.Add("bingrade", typeof(String));
newdt.Columns.Add("quantity", typeof(String));
newdt.Columns.Add("lotid", typeof(String));
newdt.Columns.Add("productionorder", typeof(String));
newdt.Columns.Add("remtype", typeof(String));
newdt.Columns.Add("reelno", typeof(String));
newdt.Columns.Add("storoagelocation", typeof(String));
newdt.Columns.Add("utstime", typeof(String));
//以上是:创建一个新的datatable,准备copy dt1表
int total = 0;
for (int i = 0; i <= dt1.Rows.Count-1; i++)//遍历dt1,如果第一列和第二列同时相同,那么将dt1中相同得行添加到新表newdt,并且对相同行中的“quantity”列进行累加同时也添加到新表newdt中
{

DataRow newdr = newdt.NewRow();

if (i == dt1.Rows.Count - 1)//如果到最后一行(实际上到了dt1的倒数第二行)
{
break;
}

if (dt1.Rows[i][0].ToString().Equals(dt1.Rows[i + 1][0].ToString()) && dt1.Rows[i][1].ToString().Equals(dt1.Rows[i + 1][1].ToString()))
{
//int quantity = Convert.ToInt32(dt1.Rows[i][2].ToString());
int quantity = Convert.ToInt32(dt1.Rows[i][2].ToString()) + Convert.ToInt32(dt1.Rows[i + 1][2].ToString());
total = total + quantity - Convert.ToInt32(dt1.Rows[i + 1][2].ToString());

newdr[0] = dt1.Rows[i][0].ToString();
newdr[1] = dt1.Rows[i][1].ToString();
newdr[2] = dt1.Rows[i][2].ToString();
newdr[3] = dt1.Rows[i][3].ToString();
newdr[4] = dt1.Rows[i][4].ToString();
newdr[5] = dt1.Rows[i][5].ToString();
newdr[6] = dt1.Rows[i][6].ToString();
newdr[7] = dt1.Rows[i][7].ToString();
newdr[8] = dt1.Rows[i][8].ToString();
newdt.Rows.Add(newdr);
}

else
{
if (i == 0)//如果只有一行数据的话
{
newdr = newdt.NewRow();
//DataRow newdr1 = new DataRow();
newdr[0] = dt1.Rows[i][0].ToString();
newdr[1] = dt1.Rows[i][1].ToString();
newdr[2] = dt1.Rows[i][2].ToString();
newdr[3] = dt1.Rows[i][3].ToString();
newdr[4] = dt1.Rows[i][4].ToString();
newdr[5] = dt1.Rows[i][5].ToString();
newdr[6] = dt1.Rows[i][6].ToString();
newdr[7] = dt1.Rows[i][7].ToString();
newdr[8] = dt1.Rows[i][8].ToString();
newdt.Rows.Add(newdr);


newdr = newdt.NewRow();
//DataRow newdr1 = new DataRow();
newdr[0] = "TOTAL BY " + dt1.Rows[i][0].ToString();
newdr[1] = dt1.Rows[i][1].ToString();
newdr[2] = dt1.Rows[i][2].ToString();
newdr[3] = " ";
newdr[4] = " ";
newdr[5] = " ";
newdr[6] = " ";
newdr[7] = " ";
newdr[8] = " ";
newdt.Rows.Add(newdr);

}
else
{
//将相同的行添加到新表newdt中
newdr = newdt.NewRow();
//DataRow newdr1 = new DataRow();
newdr[0] = dt1.Rows[i][0].ToString();
newdr[1] = dt1.Rows[i][1].ToString();
newdr[2] = dt1.Rows[i][2].ToString();
newdr[3] = dt1.Rows[i][3].ToString();
newdr[4] = dt1.Rows[i][4].ToString();
newdr[5] = dt1.Rows[i][5].ToString();
newdr[6] = dt1.Rows[i][6].ToString();
newdr[7] = dt1.Rows[i][7].ToString();
newdr[8] = dt1.Rows[i][8].ToString();
newdt.Rows.Add(newdr);



newdr = newdt.NewRow();//将累加的结果加到新表newdt中
newdr[0] = "TOTAL BY " + dt1.Rows[i][0].ToString();
newdr[1] = dt1.Rows[i][1].ToString();
//int quantity = Convert.ToInt32(dt1.Rows[i][2].ToString());
//for (int j = i; j >=0; j--)
//{
// quantity = quantity + Convert.ToInt32(dt1.Rows[j][2].ToString());
//}

newdr[2] = Convert.ToString(total + Convert.ToInt32(dt1.Rows[i][2].ToString()));
newdr[3] = " ";
newdr[4] = " ";
newdr[5] = " ";
newdr[6] = " ";
newdr[7] = " ";
newdr[8] = " ";
newdt.Rows.Add(newdr);
total = 0;
}


}


}



其中,dt1是从数据库查处的记录共有9列,遍历dt1,如果第一列和第二列同时相同,那么将dt1中相同得行添加到新表newdt,并且对相同行中的“quantity”列进行累加同时也添加到新表newdt中,之后就会得到我要的效果。



我姓区不姓区 2008-07-03
  • 打赏
  • 举报
回复

select productid,bingrade,sum(quantity) from table group by productid,bingrade
richie8398 2008-07-03
  • 打赏
  • 举报
回复
感觉lunder得写法还可以,我先试试,如果调试成功我会给分得!
hackhu 2008-07-03
  • 打赏
  • 举报
回复
先进行你说的累加什么的,在组成datatable
wdyste 2008-07-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 live_7sky 的回复:]

create table tt( a int , b int,c int)


insert into tt values(1,10,50)
insert into tt values(1,10,100)
insert into tt values(1,20,200)
insert into tt values(2,10,300)
insert into tt values(3,20,400)

select a,b,sum(c) from tt group by a,b

通过数据库分组查询,可以得到你需要的。

[/Quote]
潜龙无用 2008-07-03
  • 打赏
  • 举报
回复
带汇总行的结果可以通过sql语句中的computer by子句得到,不过只能在sql server下使用,如果你用orcale就不行了……
richie8398 2008-07-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhnzzy 的回复:]
select productid ,bingrade,quantity from tb group by productid , bingrade
[/Quote]


这个sql语句,我试了,不行。还有没有别的,我用的是Oracle数据库
richie8398 2008-07-03
  • 打赏
  • 举报
回复
不好意思,我写得结果有点出入。正确得显示效果是:

productid bingrade quantity
111 a 20
total by 111,a 30
111 b 30
total by 111,b 30
222 c 50
total by 222,c 90

其中,total by....都是在第一列显示
lunber 2008-07-03
  • 打赏
  • 举报
回复

//新建datatable,存储合并结果;
DataTable dt = new DataTable();
dt.Columns.Add("producitid", typeof(String));
dt.Columns.Add("bingrade", typeof(String));
dt.Columns.Add("quantity", typeof(int));
for(int i=0;i<datatable.Rows.Count;i++)
{
String productid=datatable.Rows[i][0].ToString();
String bingrade=datatable.Rows[i][1].ToString();
int quantity=Int32.Parse(datatable.Rows[i][2].ToString());
for(int j=0;j<datatable.Rows.Count;j++)
{
if(datatable.Rows[i][0].ToString()==datatable.Rows[j][0].ToString() && datatable.Rows[i][0].ToString()==datatable.Rows[j][0].ToString() && i!=j)
{
quantity=quantity+Int32.Parse(datatable.Rows[j][2].ToString());
}
}
DataRow dr=dt.NewRow();
dr[0]=productid;
dr[1]=bingrade;
dr[2]=quantity;
dt.Rows.Add(dr);
}

//方法有点笨,还没测试,楼主参考
jinjazz 2008-07-03
  • 打赏
  • 举报
回复
用System.Data.DataRelation

和另外一个表建立关系,然后用计算字段汇总

参考
http://blog.csdn.net/jinjazz/archive/2008/05/04/2387469.aspx
xiaoqhuang 2008-07-03
  • 打赏
  • 举报
回复
重复的贴子,哈哈

DataTable dt = new DataTable();
dt.Columns.Add("productid");
dt.Columns.Add("bingrade");
dt.Columns.Add("quantity");
dt.Rows.Add(new object[] { "111", "a", "20" });
dt.Rows.Add(new object[] { "111", "a", "10" });
dt.Rows.Add(new object[] { "111", "b", "30" });
dt.Rows.Add(new object[] { "222", "c", "50" });
dt.Rows.Add(new object[] { "222", "c", "40" });
DataTable groupTable = dt.Clone();
groupTable.PrimaryKey = new DataColumn[]{groupTable.Columns[0],groupTable.Columns[1]};
foreach (DataRow dataRow in dt.Rows)
{
DataRow groupRow = groupTable.Rows.Find(new object[] { dataRow["productid"], dataRow["bingrade"] });
if (groupRow == null)
{
groupTable.Rows.Add(dataRow.ItemArray);
}
else
{
groupRow["quantity"] = Convert.ToInt32(groupRow["quantity"]) + Convert.ToInt32(dataRow["quantity"]);
}
}
GridView1.DataSource = groupTable;
GridView1.DataBind();

silentwins 2008-07-03
  • 打赏
  • 举报
回复
用SQL重新汇总吧~~
suyiming 2008-07-03
  • 打赏
  • 举报
回复
绑定之后就不能再进行处理了,你应该在绑定之前进行处理.
建议楼主 绑定前用sql语句进行汇总
zhnzzy 2008-07-03
  • 打赏
  • 举报
回复
select productid ,bingrade,quantity from tb group by productid , bingrade
niuniuhuang 2008-07-03
  • 打赏
  • 举报
回复
把原来的SQL改一下
suyiming 2008-07-03
  • 打赏
  • 举报
回复
最土的办法,循环它
  for(int   i=0;i<datatable.Rows.Count;i++)   
{
//datatable.Rows[i][0].ToString()
}
homesos 2008-07-03
  • 打赏
  • 举报
回复
使用SQL语句进行分组查询
liyin_liu 2008-07-03
  • 打赏
  • 举报
回复
标记 MARK
live_7sky 2008-07-03
  • 打赏
  • 举报
回复

得到的结果

1
10 150 2
10 300 1
20 200 3
20 400
加载更多回复(3)

62,046

社区成员

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

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

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

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