********************************************SQL输出的数据格式***********************************************************
ALTER proc [dbo].[o_Eng_nodolist_pivot_bybillno]
as
declare @sql varchar(max)
select @sql=ISNULL(@sql + “,”,””) + QUOTENAME(CONVERT(varchar,lastday,112)) from v_o_Eng_nodolist_byadd
group by CONVERT(varchar,lastday,112)
set @sql=”select * from (select billno,sophour,CONVERT(varchar,lastday,112) lastday from v_o_Eng_nodolist_byadd) a
pivot(sum(sophour) for lastday in (” + @sql + “)) as PVT”
exec(@sql)
—
输出数据格式 A
billno 20160101 20160103 20160105 …… (估计最大列数为30)
A 100 120 150
B 10 0 0
—
select * from v_o_Eng_nodolist_byadd
—
输出的数据格式 B
billno sdate employee Eng_Sop iQty
A 20160101 何 A001 80
A 20160101 王 A002 20
………………………………………………………………
—
C#处理
DataTable t1=SQLclass.GetDt(“o_Eng_nodolist_pivot_bybillno”) //即数据格式A
DataTable t2=SQLclass.GetDt(“select * from v_o_Eng_nodolist_byadd”) //即数据格式B
怎么样得到格式(即将格式B的明细信息写到格式A对应位置)
—
billno 20160101 20160103 20160105 ……
A A001 何:80 A002 王:20
感觉无从下手,求思路或代码。
ALTER proc [dbo].[o_Eng_nodolist_pivot_bybillno]
as
declare @sql varchar(max)
select @sql=ISNULL(@sql + “,”,””) + QUOTENAME(CONVERT(varchar,lastday,112)) from v_o_Eng_nodolist_byadd
group by CONVERT(varchar,lastday,112)
set @sql=”select * from (select billno,sophour,CONVERT(varchar,lastday,112) lastday from v_o_Eng_nodolist_byadd) a
pivot(sum(sophour) for lastday in (” + @sql + “)) as PVT”
exec(@sql)
—
输出数据格式 A
billno 20160101 20160103 20160105 …… (估计最大列数为30)
A 100 120 150
B 10 0 0
—
select * from v_o_Eng_nodolist_byadd
—
输出的数据格式 B
billno sdate employee Eng_Sop iQty
A 20160101 何 A001 80
A 20160101 王 A002 20
………………………………………………………………
—
C#处理
DataTable t1=SQLclass.GetDt(“o_Eng_nodolist_pivot_bybillno”) //即数据格式A
DataTable t2=SQLclass.GetDt(“select * from v_o_Eng_nodolist_byadd”) //即数据格式B
怎么样得到格式(即将格式B的明细信息写到格式A对应位置)
—
billno 20160101 20160103 20160105 ……
A A001 何:80 A002 王:20
感觉无从下手,求思路或代码。
解决方案
75
就是循环遍历,然后更新dtA,下面的代码没测试,但应该不会有大问题
DataTable dtA = new DataTable(); DataTable dtB = new DataTable(); string primKey = "billno"; for (var i = 0; i < dtA.Rows.Count; i++) { var aRow = dtA.Rows[i]; string billno = aRow.Field<string>(primKey); foreach (DataColumn col in dtA.Columns) { if (!string.Equals(col.ColumnName, primKey, StringComparison.OrdinalIgnoreCase)) { //获取值 var query = dtB.AsEnumerable().Where(r => r.Field<string>("billno") == billno && r.Field<string>("sdate") == col.ColumnName); //更新对应列的值 aRow.SetField(col.ColumnName, string.Join(" ", query.Select(r => r.Field<string>("Eng_Sop") + " " + r.Field<string>("employee") + ":" + r.Field<int>("iQty")))); } } }
5
不是很难啊,你既然a表已经区出来了。然后就关联b表。通过 for xml path(“”)就能搞定你要的
A001 何:80 A002 王:20 这个格式
下面附上测试代码和图片
A001 何:80 A002 王:20 这个格式
下面附上测试代码和图片
--源数据 select distinct top 2 ppr.PO_No,ppr.PPR_No,wi.P_Amount from [dbo].[WMS_PPR] ppr inner join [dbo].[WMS_WarehouseInvoicing] wi on ppr.PPR_ID=wi.PPR_ID --合并后的数据 select * from ( select distinct top 1 ppr.PO_No ,ppr.PPR_No ,(SELECT cast(P_Amount as nvarchar(10))+"," FROM [WMS_WarehouseInvoicing] wi1 WHERE wi1.PPR_ID=wi.PPR_ID FOR XML PATH("")) AS StuList from [dbo].[WMS_PPR] ppr inner join [dbo].[WMS_WarehouseInvoicing] wi on ppr.PPR_ID=wi.PPR_ID ) a