DataSet中DataTable重复行删除和求和问题

tushadongjing 2007-05-31 05:08:53
我从2个不同的数据库(Oralce和MS SQL)里查询得到1个数据集的2个表
我把这个数据集的2个表合并在一起得到一个新表,现在这个新表的结构是这样的:
DataTable MyTable = ds.Tables[2]; //ds为数据集
Item Description Uom Quantity
a1 a1's description EA 10.22
a2 a2's description EA 11.00
a3 a3's description KG 25.00
a4 a4's description KG 0.23
a5 a5's description KG 1.00
a1 a1's description EA 0.25
a1 a1's description EA 56.55
a3 a3's description KG 23.65
a4 a4's description KG 25.36
我现在想把这个MyTable中字段Item重复行去掉,但是又要把Quantity的和加起来
即将MyTable变为(或者填充到ds的另一个表使变为):
Item Description Uom Quantity
a1 a1's description EA 67.02 \\(10.22 + 0.25 + 56.55)
a2 a2's description EA 11.00
a3 a3's description KG 48.65 \\(25.00 + 23.65)
a4 a4's description KG 25.59 \\(0.23 + 25.36)
a5 a5's description KG 1.00

请哪位高手帮忙解决下,不胜感激!
...全文
1164 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruanwei1987 2009-10-22
  • 打赏
  • 举报
回复
不客气 学了
ydone 2007-07-18
  • 打赏
  • 举报
回复
谢谢
J_S_S 2007-06-01
  • 打赏
  • 举报
回复
for(int i=0;i<ds.Tables["T1"].Rows.Count;i++)
{
object tempitem=ds.Tables["T1"].Rows[i][0];
for(int j=i;j<ds.Tables["T1"].Rows.Count;j++)
{
if(tempitem == ds.Tables["T1"].Rows[j][0])
{
ds.Tables["T1"].Rows[i][3] = (int)ds.Tables["T1"].Rows[i][3] + (int)ds.Tables["T1"].Rows[j][3];
ds.Tables["T1"].Rows.RemoveAt(j);
}
}
}


=========================
不知道会出错没。
没测试。
tushadongjing 2007-06-01
  • 打赏
  • 举报
回复
能不能给个具体的代码:
比如:
原来的表是T1,我在T1中去掉重复行并求和后放入T2
for (int i = 0, j = ds.Tables["T1"].Rows.Count; i<j; i++)
{
string tempitem = ds.Tables[0].Rows[i][0].ToString();
DataRow[] rows;
rows = ds.Tables["T1"].Select("Item = '" + tempitem + "' ");
if (rows.Length > 1)
{
\\我选择出了重复的行,怎么求和呢
}
\\这里面不会写了,惭愧
}
tushadongjing 2007-06-01
  • 打赏
  • 举报
回复
谢谢,结帖
zxkid 2007-06-01
  • 打赏
  • 举报
回复
dtClone.Rows[dtClone.Rows.Count - 1]["Quantity"] = (decimal)MyTable.Compute("Sum(Quantity)", string.Format("Item = '{0}'", dr["Item"].ToString());//合计
zxkid 2007-06-01
  • 打赏
  • 举报
回复
DataTable MyTable = ds.Tables[2]; //ds为数据集

DataTable dtClone = MyTable.Clone(); //创建新表
DataView dv = new DataView(dtClone); //用于查找
dv.Sort = "Item";
foreach(DataRow dr in MyTable.Rows) //单循环, 效率高一点
{
int rowIndex = dv.FindRow(dr["Item"]);
if (rowIndex == -1)
{
dtClone.ImportRow(dr); //添加行
dtClone.Rows[dtClone.Rows - 1]["Quantity"] = (decimal)MyTable.Compute("Sum(Quantity)", string.Format("Item = '{0}'", dr["Item"].ToString());//合计
}
}
dtClone.AcceptChanges();

ds.Tables.Remove(MyTable); //删除旧表
ds.Tables.Add(dtClone); //添加新表
tushadongjing 2007-06-01
  • 打赏
  • 举报
回复
zxkid
你好,我有点愚钝,可以给点注释吗?谢谢!
还还看不懂删除重复行怎么实现的,不好意思!
tushadongjing 2007-06-01
  • 打赏
  • 举报
回复
啊,谢谢各位,我刚正在测试,zxkid又给我更多指教,万分感谢,刚我对J_S_S(星际垃圾)进行了一点点修改问题解决了,代码如下:
for (int i = 0; i < ds.Tables["T1"].Rows.Count; i++)
{
tring tempitem = ds.Tables["T1"].Rows[i][0].ToString();
for (int j = i + 1; j < ds.Tables["T1"].Rows.Count; j++)
{
if (tempitem == ds.Tables["T1"].Rows[j][0].ToString())
{
ds.Tables["T1"].Rows[i][2] = float.Parse(ds.Tables["T1"].Rows[i][2].ToString()) + float.Parse(ds.Tables["T1"].Rows[j][2].ToString());
ds.Tables["T1"].Rows.RemoveAt(j);
j = j - 1;
}
}
}
我试下zxkid的代码
准备结帖,请各位再看下我写的有什么要更改的地方(我测试已经通过了),谢谢各位!
zxkid 2007-06-01
  • 打赏
  • 举报
回复
DataTable MyTable = ds.Tables[2]; //ds为数据集

DataTable dtClone = MyTable.Clone();
DataView dv = new DataView(dtClone);
dv.Sort = "Item";
foreach(DataRow dr in MyTable.Rows)
{
int rowIndex = dv.FindRow(dr["Item"]);
if (rowIndex == -1)
{
dtClone.ImportRow(dr);
dtClone.Rows[dtClone.Rows - 1]["Quantity"] = (decimal)MyTable.Compute("Sum(Quantity)", string.Format("Item = '{0}'", dr["Item"].ToString());
}
}
dtClone.AcceptChanges();

ds.Tables.Remove(MyTable);
ds.Tables.Add(dtClone);
zxkid 2007-06-01
  • 打赏
  • 举报
回复
DataTable MyTable = ds.Tables[2]; //ds为数据集

DataTable dtClone = MyTable.Clone;
DataView dv = new DataView(dtClone);
dv.Sort = "Item";
foreach(DataRow dr in MyTable.Rows)
{
int rowIndex = dv.FindRow(dr["Item"]);
if (rowIndex == -1)
{
dtClone.ImportRow(MyTable.Rows[i]);
dtClone.Rows[dtClone.Rows - 1]["Quantity"] = (decimal)MyTable.Compute("Sum(Quantity)", string.Format("Item = '{0}'", dr["Item"].ToString());
}
}
dtClone.AcceptChanges();

ds.Tables.Remove(MyTable);
ds.Tables.Add(dtClone);
==
随手写了一下 没测试
tushadongjing 2007-06-01
  • 打赏
  • 举报
回复
刚上班,我试试了,谢谢.
hanmlxiao 2007-05-31
  • 打赏
  • 举报
回复
一定有这样看来只有遍历表,对比计算了,将生成的结果放到 一个DataTable里面去,用这个DataTable 来做数据源绑定
tushadongjing 2007-05-31
  • 打赏
  • 举报
回复
这个我已经试过了,用了临时表
可以做到,但是出现了中文字乱码的问题
因此我想看可不可以不通过SQL直接做到这一点
hanmlxiao 2007-05-31
  • 打赏
  • 举报
回复
在sql里执行不是更好吗??

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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