首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

动态行转列解决方法

2012-02-04 
动态行转列想请教个问题.我有3个表一个表是 OWOR [生产订单表]字段DOCNUM(工单号)ITEMCODE(物料编码)ITEMN

动态行转列
想请教个问题.
我有3个表
一个表是 OWOR [生产订单表] 
字段
DOCNUM(工单号) ITEMCODE(物料编码) ITEMNAME(物料描述) PLANNEDQTY(计划量)
1001 301 A 1000

第二个表 OIGN(主表 收货工单) IGN1(明细表 收货工单明细)
字段 OIGN
DOCENTRY(主表与明细表连接号) DOCNUM(工单号) DOCDATE(过帐日期)
1 10011 2011-4-10
2 10012 2011-4 12
3 10013 2011-4-13

字段IGN1
DOCENTRY(主表与明细表连接号) BASEREF(生产工单号) ITEMCODE(物料编码) DSCRIPTION(物料描述) QUANTITY(数量)
1 1001 301 A 500
2 1001 301 A 300
3 1001 301 A 200

我想要达到的效果是:

docnum itemcode itemname plannedqty docnum docdate quantity docnum docdate quantity ...
1001 301 A 1000 10011 2011-4-10 500 10012 2011-4-12 300 200


就是以生产定单为依据,将所有和生产定单对应的收货单号、日期、数量横向显示到后面.
因为每个生产定单可能分很多次收货,所以这个列是动态的.



[解决办法]

SQL code
declare @sql varchar(8000)set @sql = 'select t1.DOCNUM,t1.ITEMCODE,t1.ITEMNAME,t1.PLANNEDQTY 'select @sql = @sql + ' , max(case convert(varchar(10),t2.DOCDATE,120) when ''' + DOCDATE + ''' then t2.DOCNUM else null end) [DOCNUM_' + DOCDATE + ']'                   + ' , max(case convert(varchar(10),t2.DOCDATE,120) when ''' + DOCDATE + ''' then t2.DOCDATE else null end) [DOCDATE_' + DOCDATE + ']'                   + ' , max(case convert(varchar(10),t2.DOCDATE,120) when ''' + DOCDATE + ''' then t3.QUANTITY else null end) [QUANTITY_' + DOCDATE + ']'from (select distinct convert(varchar(10),DOCDATE,120) DOCDATE from OIGN ) as aset @sql = @sql + ' from OWOR t1, OIGN t2 , IGN1 t3 where t1.DOCNUM = t3.BASEREF and t3.DOCENTRY = t2.DOCENTRY group by t1.DOCNUM,t1.ITEMCODE,t1.ITEMNAME,t1.PLANNEDQTY'exec(@sql) 

热点排行