问题描述
我现有一DATATABLE里面的数据如下nameaddressage付一A18付二b20付二b21付二c22我想合成这样的一个datatablenameaddressage付一A18付二b,c63如何能实现啊...思路不太清楚.我理解的就是根据name列里面的数据判断一样的话,就让address列的数据+=用逗号分开再把他们的age列数据相加.用上for循环实现感觉自己有点迷糊..希望那位大侠指点下
解决方案
解决方案二:
按name分组,连接address字符串,age相加!
解决方案三:
楼上说得对.用视图吧
解决方案四:
你是要在DataTable中作处理还是在sql中处理后再绑到DataTable中?
解决方案五:
最好能在SQL中处理,不然在代码中还不是很容易,有点麻烦。按2楼说的应该就没问题
解决方案六:
用视图做或者用SQL做自己写一写SQL句然后在数据绑定
解决方案七:
先将你自己的数据通过循环,过滤出来,相同列用一个全局变量递加,中间用,隔开数据过滤后,就是三个全局变量,再用这三个全局变量写成一个一个table就可以了下面的代码是,将全局变量写成table的方法至于开始的数据如何提取出来,你得自己写个循环方法得修改一下、我这里数组soul和soulid是元素一样多的而且你那里不能用,最全局变量的分隔符varsoul=unitnameArraylist.Split(',');varsoulid=unitidArraylist.Split(',');DataTabletable1=newDataTable();table1.Columns.Add("unitname3");table1.Columns.Add("unitid3");for(inti=0;i<soulid.Length-1;i++){DataRowNewRow=table1.NewRow();NewRow["unitid3"]=soulid[i].ToString();NewRow["unitname3"]=soul[i].ToString();table1.Rows.Add(NewRow);}
解决方案八:
address里要判断,这种最好在存储过程中通过游标实现
解决方案九:
DataTabletmpdt=dt.Clone();foreach(DataRowdrindt.Rows){if(tmpdt.Rows.Count==0){tmpdt.ImportRow(dr);}stringname=dr[name].ToString();stringaddress=dr[address].ToString();intage=int.Parse(mydr[age].ToString());DataRow[]drs=tmdt.select("name='"+name+"'");if(drs.Length>0){foreach(DataRowmydrindrs){address+=(mydr[address].ToString()+',');age+=int.Parse(mydr[age].ToString());}DataRownr=tmpdt.NewRow();nr[name]=name;nr[address]=address;nr[age]=age;}}
解决方案十:
DataTabletmpdt=dt.Clone();foreach(DataRowdrindt.Rows){if(tmpdt.Rows.Count==0){tmpdt.ImportRow(dr);}stringname=dr[name].ToString();stringaddress=dr[address].ToString();intage=int.Parse(mydr[age].ToString());DataRow[]drs=tmdt.select("name='"+name+"'");if(drs.Length>0){foreach(DataRowmydrindrs){address+=(mydr[address].ToString()+',');age+=int.Parse(mydr[age].ToString());}DataRownr=tmpdt.NewRow();nr[name]=name;nr[address]=address;nr[age]=age;}else{tmpdt.ImportRow(dr);}}
解决方案十一:
引用2楼xslqingfeng的回复:
楼上说得对.用视图吧
好像用参数不行
解决方案十二:
学习
解决方案十三:
下面代码测试通过.protectedvoidbtnTest_Click(objectsender,EventArgse){DataTabledt=newDataTable();PrepareData(dt);introwCount=dt.Rows.Count;Hashtablehs=newHashtable();for(inti=rowCount-1;i>0;i--){DataRowdr=dt.Rows[i];stringname=dr["name"].ToString();stringaddress=dr["address"].ToString();intage=int.Parse(dr["age"].ToString());//检测名称是否重复if(hs.ContainsKey(name)){dt.Rows.RemoveAt(i);DataRow[]drFind=dt.Select(string.Format("name='{0}'",name));stringoldAddress=string.Format(",{0},",drFind[0]["address"].ToString());//检测address是否重复if(oldAddress.IndexOf(string.Format(",{0},",address))==-1){drFind[0]["address"]=string.Format("{0}{1}",address,oldAddress).TrimEnd(',');}drFind[0]["age"]=int.Parse(drFind[0]["age"].ToString())+age;dt.AcceptChanges();continue;}hs.Add(name,null);}GridView1.DataSource=dt;GridView1.DataBind();}///<summary>///准备测试数据///</summary>///<paramname="dt"></param>privatevoidPrepareData(DataTabledt){dt.Columns.Add("name",typeof(System.String));dt.Columns.Add("address",typeof(System.String));dt.Columns.Add("age",typeof(System.Int32));DataRowdr=dt.NewRow();dr["name"]="付一";dr["address"]="A";dr["age"]=18;dt.Rows.Add(dr);dr=dt.NewRow();dr["name"]="付二";dr["address"]="b";dr["age"]=20;dt.Rows.Add(dr);dr=dt.NewRow();dr["name"]="付二";dr["address"]="b";dr["age"]=21;dt.Rows.Add(dr);dr=dt.NewRow();dr["name"]="付二";dr["address"]="c";dr["age"]=22;dt.Rows.Add(dr);}
解决方案十四:
引用楼主fsxcc的帖子:
我现有一DATATABLE里面的数据如下nameaddressage付一A18付二b20付二b21付二c22我想合成这样的一个datatablenameaddressage付一A18付二b,c63如何能实现啊...思路不太清楚.我理解的就是根据name列里面的数据判断一样的话,就让address列的数据+=用逗号分开再把他们的age列数据相加.…
不如在SQL中处理,呵呵!createfunctionfd(@vavarchar(10))returnsvarchar(8000)asBEGINDECLARE@svarchar(8000)set@s=''select@s=@s+','+addressfrom(SELECTDISTINCTNAME,ADDRESSFROMTB)ASTwhere[NAME]=@vareturn@sENDSELECTT1.*,T2.AGEFROM(select[NAME],dbo.fd([NAME])ADDRESSfrom(SELECTDISTINCTNAME,ADDRESSFROMTB)ASTGROUPBY[NAME])AST1,(SELECTNAME,SUM(AGE)AGEFROMTBGROUPBYNAME)AST2WHERET1.NAME=T2.NAME
解决方案十五:
引用13楼SQL77的回复:
引用楼主fsxcc的帖子:我现有一DATATABLE里面的数据如下nameaddressage付一A18付二b20付二b21付二c22我想合成这样的一个datatablenameaddressage付一A18付二b,c63如何能实现啊...思路不太清楚.我理解的就是根据name列里面的数据判断一样的话,就让address列的数据+=用逗号分开…
createfunctionfd(@vavarchar(10))returnsvarchar(8000)asBEGINDECLARE@svarchar(8000)set@s=''select@s=@s+','+addressfrom(SELECTDISTINCTNAME,ADDRESSFROMTB)ASTwhere[NAME]=@vareturn@sENDSELECTT1.*,T2.AGEFROM(select[NAME],dbo.fd([NAME])ADDRESSfrom(SELECTDISTINCTNAME,ADDRESSFROMTB)ASTGROUPBY[NAME])AST1,(SELECTNAME,SUM(AGE)AGEFROMTBGROUPBYNAME)AST2WHERET1.NAME=T2.NAME
改成SQL形式