2个DataTable要生成汇总表问题

.Net技术 码拜 8年前 (2016-03-12) 778次浏览
********************************************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
感觉无从下手,求思路或代码。
解决方案

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 这个格式
下面附上测试代码和图片

--源数据
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

2个DataTable要生成汇总表问题


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明2个DataTable要生成汇总表问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)