datatable合并行问题

accpchenjun 2009-12-04 09:08:21
datatable结构是
cat_id gdp_id qty
1 2 3
1 2 4
1 2 5
2 1 1
2 1 2

要求把cat_id和gdp_id相同的行合并成一行 并求出qty的平均值
如何做
...全文
717 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly576107712 2012-02-08
  • 打赏
  • 举报
回复
看答案的
tobypy1987 2011-07-11
  • 打赏
  • 举报
回复
如果不是数字,是字符串相加可以吗?
accpchenjun 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ojlovecd 的回复:]
我明白你的意思,但是你的DataTable有很多行,psn_id也有多行的值吧?
qty你取的是平均值,那psn_id你要取哪行的?
[/Quote]
不好意思 是我没说清楚也没理解你的意思
完整表的结构是这样 刚才写漏了 如果有相同的记录它的psn_id和cat_unit一定是相同的 还有一个功能就要统计相同数据的总金额也就price*qty
cat_id gdp_id price qty psn_id cat_unit
1 2 10 10 001 盒
1 2 20 20 001 盒
2 1 30 30 001 盒
2 1 40 40 001 盒
Lovely_baby 2009-12-04
  • 打赏
  • 举报
回复
var result = from row in rows group row by new { cat_id = row["cat_id"], gdp_id = row["gdp_id"] } into g select new { g.Key.cat_id, g.Key.gdp_id, qty = g.Average(r => Convert.ToInt32(r["qty"])) };


psn_id是哪个表中的值??
在select new 后面加上 (表名+psn_id)
我姓区不姓区 2009-12-04
  • 打赏
  • 举报
回复
我明白你的意思,但是你的DataTable有很多行,psn_id也有多行的值吧?
qty你取的是平均值,那psn_id你要取哪行的?
accpchenjun 2009-12-04
  • 打赏
  • 举报
回复
非常刚下你的解答
[Quote=引用 12 楼 ojlovecd 的回复:]
引用 10 楼 accpchenjun 的回复:

请教这句话 如果我datatable里还有一些其他的字段应该怎么写
dt.Columns.AddRange(new DataColumn[] { new DataColumn("cat_id"), new DataColumn("gdp_id"), new DataColumn("qty"), new DataColumn("psn_id") });
那psn_id这个字段你想取哪行的值?
[/Quote]
psn_id单独一行的 我的表完整结构是这样
cat_id gdp_id qty psn_id
1 2 10 001
我就想问这句
var result = from row in rows group row by new { cat_id = row["cat_id"], gdp_id = row["gdp_id"] } into g select new { g.Key.cat_id, g.Key.gdp_id, qty = g.Average(r => Convert.ToInt32(r["qty"])) }; 如何把psn_id也查出来 怎么用g.key.不出来
我姓区不姓区 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 accpchenjun 的回复:]

请教这句话 如果我datatable里还有一些其他的字段应该怎么写
dt.Columns.AddRange(new DataColumn[] { new DataColumn("cat_id"), new DataColumn("gdp_id"), new DataColumn("qty"), new DataColumn("psn_id") });

[/Quote]
那psn_id这个字段你想取哪行的值?
zcl24 2009-12-04
  • 打赏
  • 举报
回复
使用工具类DataSetHelper 可以实现table Group by 之类的功能
http://docs.google.com/View?id=ddxkfnps_315ck25tgzp
CSDN真是太差劲了 稍大一点的代码都贴不上来
     [Test]
public void DataSetTest()
{
DataTable dt = new DataTable();
dt.TableName = "aa";
// cat_id gdp_id qty
//1 2 3
//1 2 4
//1 2 5
//2 1 1
//2 1 2
dt.Columns.Add("cat_id");
dt.Columns.Add("gdp_id");
dt.Columns.Add("qty");

DataRow dr = dt.NewRow();
dr[0] = 1;
dr[1] = 2;
dr[2] = 3;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 1;
dr[1] = 2;
dr[2] = 4;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 1;
dr[1] = 2;
dr[2] = 5;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 2;
dr[1] = 1;
dr[2] = 1;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 2;
dr[1] = 1;
dr[2] = 2;
dt.Rows.Add(dr);

DataSetHelper ds = new DataSetHelper();
DataTable outdt = ds.SelectGroupByInto("aa", dt, "cat_id,gdp_id,sum(qty) sumqty", "cat_id>0", "cat_id,gdp_id");
Console.WriteLine(outdt.Columns[0] + " " + outdt.Columns[1] + " " + outdt.Columns[2]);
foreach (DataRow tdr in outdt.Rows)
{
Console.WriteLine(dr[0]+" "+ tdr[1]+" "+ tdr[2]);
}
}
accpchenjun 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ojlovecd 的回复:]
var result = from row in rows group row by new { cat_id = row["cat_id"], gdp_id = row["gdp_id"] } into g select new { g.Key.cat_id, g.Key.gdp_id, qty = g.Average(r => Convert.ToInt32(r["qty"])) };
[/Quote]

请教这句话 如果我datatable里还有一些其他的字段应该怎么写
dt.Columns.AddRange(new DataColumn[] { new DataColumn("cat_id"), new DataColumn("gdp_id"), new DataColumn("qty"), new DataColumn("psn_id") });
我姓区不姓区 2009-12-04
  • 打赏
  • 举报
回复

DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[] { new DataColumn("cat_id"), new DataColumn("gdp_id"), new DataColumn("qty") });
dt.Rows.Add(1, 2, 3);
dt.Rows.Add(1, 2, 4);
dt.Rows.Add(1, 2, 5);
dt.Rows.Add(2, 1, 1);
dt.Rows.Add(2, 1, 2);
DataTable dtResult = new DataTable();
foreach (DataColumn dc in dt.Columns)
dtResult.Columns.Add(new DataColumn(dc.ColumnName));
var rows = dt.Rows.Cast<DataRow>();
var result = from row in rows group row by new { cat_id = row["cat_id"], gdp_id = row["gdp_id"] } into g select new { g.Key.cat_id, g.Key.gdp_id, qty = g.Average(r => Convert.ToInt32(r["qty"])) };
foreach (var r in result)
dtResult.Rows.Add(r.cat_id, r.gdp_id, r.qty);

zhujiazhi 2009-12-04
  • 打赏
  • 举报
回复
DataTable table = new DataTable();
//...
List<string> list = new List<string>();
for (int i = table.Rows.Count - 1; i >= 0; ++i )
{
DataRow row = table.Rows[i];
string tempid = row[0].ToString() + row[1].ToString();
if (!list.Contains(tempid))
{
DataRow[] samerows = table.Select(string.Format("cat_id='{0}' and gdp_id='{1}'", row[0], row[1]));
double sum = Convert.ToDouble(row[3]);
foreach(DataRow r in samerows)
{
sum += Convert.ToDouble(r[3]);
}
sum = sum/(samerows.Length + 1);
row[3] = sum;
}
else
{
table.Rows.Remove(row);
}
}
yzf86211861 2009-12-04
  • 打赏
  • 举报
回复
合并GIRDVIEW 的 代码网上 一搜 一大堆 还是 自己 学习 下 怎么写的好,因为合并的情况是不同的,看需求。 很 经常用到的,所以还是 学习下,才是根本上解决问题。
chenzeye 2009-12-04
  • 打赏
  • 举报
回复
SELECT (cat_id+gdp_id) as Total, sum(qty ) WHERE cat_id=gdp_id group by cat_id,gdp_id
tkscascor 2009-12-04
  • 打赏
  • 举报
回复
DataTable dt2=sourceTable.Clone();
int sum=0;
int tmp=0;
foreach(DataRow dr in sourceTable.Rows)
{
if(dt2.Select("cat_id="+dr["cat_id"].ToString()+" && gdp_id="+dr["gdp_id"].ToString()).Count()==0)
{
dt2.ImportRow(dr);
}
tmp=int.Parse(dr["qty"].ToString())+int.Parse(dr["cat_id"].ToString())+int.Parse(dr["gdp_id"].ToString());
double dResult=tmp/3(你的除数);
}
accpchenjun 2009-12-04
  • 打赏
  • 举报
回复
最终的结果是 合并相同行 求相同行qty的平均值 和总和
我姓区不姓区 2009-12-04
  • 打赏
  • 举报
回复
var result = from row in dt.Rows.Cast<DataRow>() group row by new { cat_id = row["cat_id"], gdp_id = row["gdp_id"] } into g select new { g.Key.cat_id, g.Key.gdp_id, qty = g.Average(r => Convert.ToInt32(r["qty"])), psn_id = g.ElementAt(0)["psn_id"], cat_unit = g.ElementAt(0)["cat_unit"] };


cat_id gdp_id price qty psn_id cat_unit
1 2 10 10 001 盒
1 2 20 20 001 盒
那总金额应该是10*10还是20*20还是30*30还是15*15?
accpchenjun 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 viewstates 的回复:]
DataTable dt2=sourceTable.Clone();
int sum=0;
  int tmp=0;
foreach(DataRow dr in sourceTable.Rows)
{
  if(dt2.Select("cat_id="+dr["cat_id"].ToString()+" AND gdp_id="+dr["gdp_id"].ToString()).Count()==0)
  {
    dt2.ImportRow(dr);
  }
    tmp=int.Parse(dr["qty"].ToString());
  sum+=tmp;
}
float average=sum/sourceTable.Rows.Count;
[/Quote]
感谢你的回复 我想要的是求相同行的平均值 不是所有行的平均值
ViewStates 2009-12-04
  • 打赏
  • 举报
回复
DataTable dt2=sourceTable.Clone();
int sum=0;
int tmp=0;
foreach(DataRow dr in sourceTable.Rows)
{
if(dt2.Select("cat_id="+dr["cat_id"].ToString()+" AND gdp_id="+dr["gdp_id"].ToString()).Count()==0)
{
dt2.ImportRow(dr);
}
tmp=int.Parse(dr["qty"].ToString());
sum+=tmp;
}
float average=sum/sourceTable.Rows.Count;
limit_clear 2009-12-04
  • 打赏
  • 举报
回复
帮顶!
liaoyukun111 2009-12-04
  • 打赏
  • 举报
回复
UP

62,041

社区成员

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

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

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

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