两个或多个DataSet或DataTable相加

liuyjcel 2011-08-16 08:34:32
DataSet或DataTable 的数据结构都是一样。如下:
DataSet1的数据:
产品 日期 数量 金额
产品1 01 12 100
产品2 01 2 230

DataSet2的数据:
产品 日期 数量 金额
产品1 01 120 2100
产品2 01 42 2230

想得到的数据:
产品 日期 数量 金额
产品1 01 132 2200
产品2 01 44 2460
...全文
943 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Johan. 2013-06-28
  • 打赏
  • 举报
回复
引用 5 楼 huangwenquan123 的回复:
1:循环添加行

            DataTable d1 = getTable();
            DataTable d2 = getTable2();
            foreach (DataRow row in d2.Rows)
            {
                DataRow r = d1.NewRow();
                r[0] = row[0];
                r[1] = row[1];
                //....
                d1.Rows.Add(r);
            }
2:合并
            DataTable d1 = getTable();
            DataTable d2 = getTable2();
            d1.Merge(d2);
这么好的答案,感谢了。
huangwenquan123 2011-08-16
  • 打赏
  • 举报
回复
帅哥督察提供
            var linq = from tb1 in dt1.AsEnumerable()
join tb2 in dt2.AsEnumerable()
on new { id = tb1.Field<string>("ProductID"), time = tb1.Field<string>("Time") } equals new { id = tb2.Field<string>("ProductID"), time = tb2.Field<string>("Time") } into des
from tb2 in des.DefaultIfEmpty()
select new { product = tb1.Field<string>("ProductID"), number = tb1.Field<int>("Number") + (tb2 == null ? 0 : tb2.Field<int>("Number")), money = tb1.Field<decimal>("Money") + (tb2 == null ? 0 : tb2.Field<decimal>("Money")) };
foreach (var l in linq)
Response.Write(string.Format("{0} {1} {2} <br/>", l.product, l.number, l.money));
liuyjcel 2011-08-16
  • 打赏
  • 举报
回复
where tb1.Field<string>("ProductID") == tb2.Field<string>("ProductID") && tb1.Field<DateTime>("Time")==tb2.Field<DateTime>("Time")
这句中Time可以使用左连接不?
Im_Sorry 2011-08-16
  • 打赏
  • 举报
回复
你的意思的 查询出两个数据集,在一个Dataset或者datatable 里面把!

用多表联查, 怎么用百度就知道了,给你这个提示!
liuyjcel 2011-08-16
  • 打赏
  • 举报
回复
因为我刚才才发现一个问题。
DataTable dt1 = getTable();
DataTable dt2 = getTable2();

dt1中的日期是全的。。就是每个月的天数都存在。
但dt2 却不一定了。

所以使用上面的方法有些数据就加不起来。
liuyjcel 2011-08-16
  • 打赏
  • 举报
回复
再咨询一下。这样可以做左连接之类的不??
_程序员 2011-08-16
  • 打赏
  • 举报
回复
这个要用循环了,好像没有什么简单的方法,一个一个取值一个一个相加吧
huangwenquan123 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 liuyjcel 的回复:]
引用 8 楼 huangwenquan123 的回复:
C# code

DataTable dt1 = getTable();
DataTable dt2 = getTable2();
var linq = from tb1 in dt1.AsEnumerable()
join tb2 in dt2.AsEnumerable……


假若我的多条件呢??就是说产品“Produc……
[/Quote]

DataTable dt1 = getTable();
DataTable dt2 = getTable2();
var linq = from tb1 in dt1.AsEnumerable()
from tb2 in dt2.AsEnumerable()
where tb1.Field<string>("ProductID") == tb2.Field<string>("ProductID") && tb1.Field<DateTime>("Time")==tb2.Field<DateTime>("Time")
select new { product = tb1.Field<string>("ProductID"), number = tb1.Field<int>("Number") + tb2.Field<int>("Number"), money = tb1.Field<decimal>("Money") + tb2.Field<decimal>("Money") };
foreach (var l in linq)
Response.Write(string.Format("{0} {1} {2} <br/>", l.product, l.number, l.money));
子夜__ 2011-08-16
  • 打赏
  • 举报
回复
你这个合并之后还要相加
第一种办法用MERGE 然后遍历里面的行 ID 相同的来累加

第二种办法直接用LINQ

以前的帖子 类似
liuyjcel 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 huangwenquan123 的回复:]
C# code

DataTable dt1 = getTable();
DataTable dt2 = getTable2();
var linq = from tb1 in dt1.AsEnumerable()
join tb2 in dt2.AsEnumerable……
[/Quote]

假若我的多条件呢??就是说产品“ProductID”是一个条件,还有一个日期“Day”;
那这部分怎么写呢?? on tb1.Field<string>("ProductID") equals tb2.Field<string>("ProductID")
cena_jin 2011-08-16
  • 打赏
  • 举报
回复
学习学习~~~
wuxiaoke2009 2011-08-16
  • 打赏
  • 举报
回复
xuexixia
huangwenquan123 2011-08-16
  • 打赏
  • 举报
回复
两个表结构
    public DataTable getTable()
{
DataTable dt = new DataTable("");
dt.Columns.Add("ProductID", typeof(System.String));
dt.Columns.Add("Number", typeof(System.Int32));
dt.Columns.Add("Money", typeof(System.Decimal));
DataRow row = dt.NewRow();
row[0] = "产品1";
row[1] = 12;
row[2] = 100;
dt.Rows.Add(row);
DataRow row1 = dt.NewRow();
row1[0] = "产品2";
row1[1] = 2;
row1[2] = 230;
dt.Rows.Add(row1);
return dt;
}
public DataTable getTable2()
{
DataTable dt = new DataTable("");
dt.Columns.Add("ProductID", typeof(System.String));
dt.Columns.Add("Number", typeof(System.Int32));
dt.Columns.Add("Money", typeof(System.Decimal));
DataRow row = dt.NewRow();
row[0] = "产品1";
row[1] = 120;
row[2] = 2100;
dt.Rows.Add(row);
DataRow row1 = dt.NewRow();
row1[0] = "产品2";
row1[1] = 42;
row1[2] = 2230;
dt.Rows.Add(row1);
return dt;
}
huangwenquan123 2011-08-16
  • 打赏
  • 举报
回复

DataTable dt1 = getTable();
DataTable dt2 = getTable2();
var linq = from tb1 in dt1.AsEnumerable()
join tb2 in dt2.AsEnumerable()
on tb1.Field<string>("ProductID") equals tb2.Field<string>("ProductID")
select new { product = tb1.Field<string>("ProductID"), number = tb1.Field<int>("Number") + tb2.Field<int>("Number"), money = tb1.Field<decimal>("Money") + tb2.Field<decimal>("Money") };
foreach (var l in linq)
Response.Write(string.Format("{0} {1} {2} <br/>", l.product, l.number, l.money));
/*
产品1 132 2200
产品2 44 2460
*/
linus2008117 2011-08-16
  • 打赏
  • 举报
回复
foreach(DataRow item table1.Rows)
{
var rows = tabl2.Select(string.Format("产品='{0}'",item["产品"]));
//doit
rows = table3.Select(string.Format("产品='{0}'",item["产品"]));
//doit
}

大概是这个意思,很久没用datatable,你自己看下
liuyjcel 2011-08-16
  • 打赏
  • 举报
回复
各位大侠可能没有看到我想要的结果。
huangwenquan123 2011-08-16
  • 打赏
  • 举报
回复
1:循环添加行

DataTable d1 = getTable();
DataTable d2 = getTable2();
foreach (DataRow row in d2.Rows)
{
DataRow r = d1.NewRow();
r[0] = row[0];
r[1] = row[1];
//....
d1.Rows.Add(r);
}

2:合并
            DataTable d1 = getTable();
DataTable d2 = getTable2();
d1.Merge(d2);
md5e 2011-08-16
  • 打赏
  • 举报
回复
Jack2013tong 2011-08-16
  • 打赏
  • 举报
回复
方法一就是循环取出每个产品相加
如果你的这两个数据均是从数据库取的直接在数据库用视图来合并这两个数据不是更好?
tomysea 2011-08-16
  • 打赏
  • 举报
回复

DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
dt1.Merge(dt2); //dt2合并到dt1中
加载更多回复(1)

62,039

社区成员

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

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

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

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