日期:2014-05-18  浏览次数:20646 次

动态行转列
想请教个问题.
我有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 a
set @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)