原帖:http://community.csdn.net/Expert/topic/4567/4567483.xml?temp=.4623834

解决方案 »

  1.   

    需求样式:
    材料  规格   单位  类别  合计__产品    AA             AB           ...
    产品规格         AA_            BB_          ...
    产品产量 390.000000 5.000000 5.000000     ...
    a NULL NULL 计划消耗 780.000000 10.000000      10.000000    ...
    b NULL NULL 计划消耗 780.000000 10.000000       10.000000    ...
    c NULL NULL 计划消耗 780.000000 10.000000       10.000000    ...
      

  2.   

    需求样式:
    材料  规格   单位  类别   合计__产品    AA            BB           ...
    产品规格         AA_            BB_          ...
    产品产量 390.000000 5.000000   5.000000     ...
    a NULL NULL 计划消耗 780.000000 10.000000    10.000000    ...
    b NULL NULL 计划消耗 780.000000 10.000000    10.000000    ...
    c NULL NULL 计划消耗 780.000000 10.000000    10.000000    ...
      

  3.   

    set nocount on
    CREATE TABLE BOM单(产品 varchar(10),材料 varchar(10),消耗 decimal(28,6))
    declare @i int
    declare @J int
    set @J = 0
    set @i = 0
    while @I < 4
    begin
       while @j < 26
          begin
              insert bom单 select char(65+@i)+char(65+@j),N'a',2
              insert bom单 select char(65+@i)+char(65+@j),N'b',2
              insert bom单 select char(65+@i)+char(65+@j),N'c',2
              set @j = @J + 1
          end
        set @i = @i + 1
        set @J = 0
    end
    go
    CREATE TABLE 产品生产计划( 产品 varchar(10),产品规格 varchar(10),产量 decimal(28,6))
    declare @ii int
    declare @jj int
    set @jj = 0
    set @ii = 0
    while @ii < 3
    begin
       while @jj < 26
          begin
              insert 产品生产计划 select char(65+@ii)+char(65+@jj),char(65+@ii)+char(65+@jj)+'_',5
              set @jj = @jj + 1
          end
        set @ii = @ii + 1
        set @jj = 0
    end
    goCREATE TABLE 产品生产物料采购计划( 产品 varchar(10),产品规格 varchar(10),产量 decimal(28,6),材料 varchar(60),规格 varchar(60),单位 varchar(4),消耗 decimal(28,6),计划消耗 decimal(28,6))
    DECLARE @p产品 varchar(10)
    DECLARE @p产品规格 varchar(10)
    DECLARE @p产量 decimal(28,6)DECLARE  cp_Cursor CURSOR FOR
    select 产品,产品规格,产量 from 产品生产计划OPEN cp_Cursor
    FETCH NEXT FROM  cp_Cursor into @p产品,@p产品规格,@p产量WHILE @@FETCH_STATUS = 0
    BEGIN
           Insert Into 产品生产物料采购计划(产品,产品规格,产量,材料,消耗,计划消耗) select @p产品,@p产品规格,@p产量,bo.材料,bo.消耗,bo.消耗*@p产量 from bom单 bo where bo.产品=@p产品
           FETCH NEXT FROM cp_Cursor into @p产品,@p产品规格,@p产量
    END
    CLOSE cp_Cursor
    DEALLOCATE cp_Cursor
    GOdeclare @sqlhead varchar(8000)
    declare @sqlend varchar(8000)
    declare @sql1 varchar(8000)
    declare @sql2 varchar(8000)
    declare @sql3 varchar(8000)
    declare @sql4 varchar(8000)declare @sqlhead_ varchar(8000)
    declare @sqlend_ varchar(8000)
    declare @sql1_ varchar(8000)
    declare @sql2_ varchar(8000)
    declare @sql3_ varchar(8000)
    declare @sql4_ varchar(8000)declare @i int
    declare @ic varchar(20)--生成数据处理临时表
    select id=identity(int,0,1),gid=0 ,a=',['+产品 +']=sum(case 产品 when ''' +产品+''' then 计划消耗 else 0 end)'
    ,b=',['+产品 +']=sum(case 产品 when ''' +产品+''' then 产量 else 0 end)'
    into # from(select distinct 产品 from 产品生产物料采购计划) a order by 产品select @i=max(len(a)) from #
    print @i
    set @i=7800/@iupdate # set gid=id/@i
    select @i=max(gid) from #--生成数据处理语句
    select @sqlhead='''  union all select 材料,产品规格, 单位, 类别=''''计划消耗'''',
    sum(计划消耗) as 合计'''
    select @sqlend=''' from 产品生产物料采购计划 group by 材料,产品规格,单位'''
    select @sql1=''
    select @sql2='select '
    select @sql3=''
    select @sql4=''select @sqlhead_='''select distinct 材料='''''''',规格='''''''', 单位='''''''', 类别=''''产品产量'''',
    sum(产量) as 合计__产品'''
    select @sqlend_=''' from 产品生产物料采购计划 group by 材料,规格,单位 '''
    select @sql1_=''
    select @sql2_='select '
    select @sql3_=''
    select @sql4_=''
    print @i
    while @i>=0
    begin
       select @ic=cast(@i as varchar),@i=@i-1  
       select @sql1='@'+@ic+' varchar(8000),'+@sql1
       select @sql2=@sql2+'@'+@ic+'='''','  
       select @sql3='select @'+@ic+'=@'+@ic+'+a from # where gid='+@ic+char(13)+@sql3  
       select @sql4=@sql4+',@'+@ic   select @sql1_='@_'+@ic+' varchar(8000),'+@sql1_
       select @sql2_=@sql2_+'@_'+@ic+'='''','  
       select @sql3_='select @_'+@ic+'=@_'+@ic+'+b from # where gid='+@ic+char(13)+@sql3_
       select @sql4_=@sql4_+',@_'+@ic
    endselect @sql1='declare '+left(@sql1,len(@sql1)-1)+char(13) 
    select @sql2=left(@sql2,len(@sql2)-1)+char(13)
    select @sql3=left(@sql3,len(@sql3)-1) 
    select @sql4=substring(@sql4,2,8000)select @sql1_='declare '+left(@sql1_,len(@sql1_)-1)+char(13) 
    select @sql2_=left(@sql2_,len(@sql2_)-1)+char(13)
    select @sql3_=left(@sql3_,len(@sql3_)-1) 
    select @sql4_=substring(@sql4_,2,8000)
    --执行
    exec( 
    @sql1_+@sql2_+@sql3_+'
    '
    +@sql1+@sql2+@sql3+'
    exec('+@sqlhead_+'+'+@sql4_+'+'+@sqlend_+'+'
    +@sqlhead+'+'+@sql4+'+'+@sqlend+')'
    )--删除临时表
    drop table #
    --*/
    godrop TABLE BOM单
    drop TABLE 产品生产计划
    drop TABLE 产品生产物料采购计划
    /*材料            规格         单位   类别       合计__产品         AA                
    ------------- ---------- ---- -------- ---------------------- --------------------
                                    产品产量     390.000000        5.000000            
    a               AA_        NULL 计划消耗     10.000000         10.000000               
    a               AB_        NULL 计划消耗     10.000000         .000000                
    a               AC_        NULL 计划消耗     10.000000         .000000                
    a               AD_        NULL 计划消耗     10.000000         .000000                    
    .....
    a               CY_        NULL 计划消耗     10.000000         .000000                    
    a               CZ_        NULL 计划消耗     10.000000         .000000                     
    b               AA_        NULL 计划消耗     10.000000         10.000000                  
    b               AB_        NULL 计划消耗     10.000000         .000000                  
    b               AC_        NULL 计划消耗     10.000000         .000000                 
    ......
    b               CX_        NULL 计划消耗     10.000000         .000000                
    b               CY_        NULL 计划消耗     10.000000         .000000              
    b               CZ_        NULL 计划消耗     10.000000         .000000                
    c               AA_        NULL 计划消耗     10.000000         10.000000              
    c               AB_        NULL 计划消耗     10.000000         .000000               
    c               AC_        NULL 计划消耗     10.000000         .000000                 
    ......
    c               CV_        NULL 计划消耗     10.000000         .000000                
    c               CW_        NULL 计划消耗     10.000000         .000000              
    c               CX_        NULL 计划消耗     10.000000         .000000              
    c               CY_        NULL 计划消耗     10.000000         .000000            
    c               CZ_        NULL 计划消耗     10.000000         .000000           
    */
      

  4.   

    仍然是要加一个合并,临时表需要加c列
    declare @sqlhead_ varchar(8000)
    declare @sqlend_ varchar(8000)
    declare @sql1_ varchar(8000)
    declare @sql2_ varchar(8000)
    declare @sql3_ varchar(8000)
    declare @sql4_ varchar(8000
    还要对应增加,......
      

  5.   

    set nocount on
    CREATE TABLE BOM单(产品 varchar(10),材料 varchar(10),消耗 decimal(28,6))
    declare @i int
    declare @J int
    set @J = 0
    set @i = 0
    while @I < 4
    begin
       while @j < 26
          begin
              insert bom单 select char(65+@i)+char(65+@j),N'a',2
              insert bom单 select char(65+@i)+char(65+@j),N'b',2
              insert bom单 select char(65+@i)+char(65+@j),N'c',2
              set @j = @J + 1
          end
        set @i = @i + 1
        set @J = 0
    end
    go
    CREATE TABLE 产品生产计划( 产品 varchar(10),产品规格 varchar(10),产量 decimal(28,6))
    declare @ii int
    declare @jj int
    set @jj = 0
    set @ii = 0
    while @ii < 3
    begin
       while @jj < 26
          begin
              insert 产品生产计划 select char(65+@ii)+char(65+@jj),char(65+@ii)+char(65+@jj)+'_',5
              set @jj = @jj + 1
          end
        set @ii = @ii + 1
        set @jj = 0
    end
    goCREATE TABLE 产品生产物料采购计划( 产品 varchar(10),产品规格 varchar(10),产量 decimal(28,6),材料 varchar(60),规格 varchar(60),单位 varchar(4),消耗 decimal(28,6),计划消耗 decimal(28,6))
    DECLARE @p产品 varchar(10)
    DECLARE @p产品规格 varchar(10)
    DECLARE @p产量 decimal(28,6)DECLARE  cp_Cursor CURSOR FOR
    select 产品,产品规格,产量 from 产品生产计划OPEN cp_Cursor
    FETCH NEXT FROM  cp_Cursor into @p产品,@p产品规格,@p产量WHILE @@FETCH_STATUS = 0
    BEGIN
           Insert Into 产品生产物料采购计划(产品,产品规格,产量,材料,消耗,计划消耗) select @p产品,@p产品规格,@p产量,bo.材料,bo.消耗,bo.消耗*@p产量 from bom单 bo where bo.产品=@p产品
           FETCH NEXT FROM cp_Cursor into @p产品,@p产品规格,@p产量
    END
    CLOSE cp_Cursor
    DEALLOCATE cp_Cursor
    GOdeclare @sqlhead varchar(8000)
    declare @sqlend varchar(8000)
    declare @sql1 varchar(8000)
    declare @sql2 varchar(8000)
    declare @sql3 varchar(8000)
    declare @sql4 varchar(8000)declare @sqlhead_ varchar(8000)
    declare @sqlend_ varchar(8000)
    declare @sql1_ varchar(8000)
    declare @sql2_ varchar(8000)
    declare @sql3_ varchar(8000)
    declare @sql4_ varchar(8000)declare @sqlhead_1 varchar(8000)
    declare @sqlend_1 varchar(8000)
    declare @sql1_1 varchar(8000)
    declare @sql2_1 varchar(8000)
    declare @sql3_1 varchar(8000)
    declare @sql4_1 varchar(8000)declare @i int
    declare @ic varchar(20)--生成数据处理临时表
    select id=identity(int,0,1),gid=0 ,a=',['+产品 +']=convert(varchar(10),sum(case 产品 when ''' +产品+''' then 计划消耗 else 0 end))'
    ,b=',['+产品 +']=convert(varchar(10),sum(case 产品 when ''' +产品+''' then 产量 else 0 end))',c=','''+产品规格+''''
    into # from(select distinct 产品,产品规格 from 产品生产物料采购计划) a order by 产品select @i=max(len(a)) from #
    print @i
    set @i=7800/@iupdate # set gid=id/@i
    select @i=max(gid) from #--生成数据处理语句
    select @sqlhead='''  union all select 材料,规格, 单位, 类别=''''计划消耗'''',
    convert(varchar(10),sum(计划消耗)) as 合计'''
    select @sqlend=''' from 产品生产物料采购计划 group by 材料,规格,单位'''
    select @sql1=''
    select @sql2='select '
    select @sql3=''
    select @sql4=''select @sqlhead_=''' union all select distinct 材料='''''''',规格='''''''', 单位='''''''', 类别=''''产品产量'''',
    convert(varchar(10),sum(产量)) as 合计__产品'''
    select @sqlend_=''' from 产品生产物料采购计划 group by 材料,规格,单位 '''
    select @sql1_=''
    select @sql2_='select '
    select @sql3_=''
    select @sql4_=''select @sqlhead_1='''select distinct 材料='''''''',规格='''''''', 单位='''''''', 类别=''''产品规格'''',
    '''''''' as 合计__产品'''
    select @sqlend_1=''' from 产品生产物料采购计划 group by 材料,规格,单位 '''
    select @sql1_1=''
    select @sql2_1='select '
    select @sql3_1=''
    select @sql4_1=''print @i
    while @i>=0
    begin
       select @ic=cast(@i as varchar),@i=@i-1  
       select @sql1='@'+@ic+' varchar(8000),'+@sql1
       select @sql2=@sql2+'@'+@ic+'='''','  
       select @sql3='select @'+@ic+'=@'+@ic+'+a from # where gid='+@ic+char(13)+@sql3  
       select @sql4=@sql4+',@'+@ic   select @sql1_='@_'+@ic+' varchar(8000),'+@sql1_
       select @sql2_=@sql2_+'@_'+@ic+'='''','  
       select @sql3_='select @_'+@ic+'=@_'+@ic+'+b from # where gid='+@ic+char(13)+@sql3_
       select @sql4_=@sql4_+',@_'+@ic
       
       select @sql1_1='@_'+@ic+'1 varchar(8000),'+@sql1_1
       select @sql2_1=@sql2_1+'@_'+@ic+'1='''','  
       select @sql3_1='select @_'+@ic+'1=@_'+@ic+'1 + c from # where gid='+@ic+char(13)+@sql3_1
       select @sql4_1=@sql4_1+',@_'+@ic+'1 '
    endselect @sql1='declare '+left(@sql1,len(@sql1)-1)+char(13) 
    select @sql2=left(@sql2,len(@sql2)-1)+char(13)
    select @sql3=left(@sql3,len(@sql3)-1) 
    select @sql4=substring(@sql4,2,8000)select @sql1_='declare '+left(@sql1_,len(@sql1_)-1)+char(13) 
    select @sql2_=left(@sql2_,len(@sql2_)-1)+char(13)
    select @sql3_=left(@sql3_,len(@sql3_)-1) 
    select @sql4_=substring(@sql4_,2,8000)select @sql1_1='declare '+left(@sql1_1,len(@sql1_1)-1)+char(13) 
    select @sql2_1=left(@sql2_1,len(@sql2_1)-1)+char(13)
    select @sql3_1=left(@sql3_1,len(@sql3_1)-1) 
    select @sql4_1=substring(@sql4_1,2,8000)
    --执行
    exec( 
    @sql1_+@sql2_+@sql3_+'
    '
    +@sql1+@sql2+@sql3+'
    '
    +@sql1_1+@sql2_1+@sql3_1+'
    exec('+@sqlhead_1+'+'+@sql4_1+'+'+@sqlend_1+'+'
    + @sqlhead_+'+'+@sql4_+'+'+@sqlend_+ ' + '
    +@sqlhead+'+'+@sql4+'+'+@sqlend + ')'
    )--删除临时表
    drop table #
    --*/
    godrop TABLE BOM单
    drop TABLE 产品生产计划
    drop TABLE 产品生产物料采购计划
      

  6.   

    set nocount on
    CREATE TABLE BOM单(产品 varchar(10),材料 varchar(10),消耗 decimal(28,6))
    declare @i int
    declare @J int
    set @J = 0
    set @i = 0
    while @I < 4
    begin
       while @j < 26
          begin
              insert bom单 select char(65+@i)+char(65+@j),N'a',2
              insert bom单 select char(65+@i)+char(65+@j),N'b',2
              insert bom单 select char(65+@i)+char(65+@j),N'c',2
              set @j = @J + 1
          end
        set @i = @i + 1
        set @J = 0
    end
    go
    CREATE TABLE 产品生产计划( 产品 varchar(10),产品规格 varchar(10),产量 decimal(28,6))
    declare @ii int
    declare @jj int
    set @jj = 0
    set @ii = 0
    while @ii < 3
    begin
       while @jj < 26
          begin
              insert 产品生产计划 select char(65+@ii)+char(65+@jj),char(65+@ii)+char(65+@jj)+'_',5
              set @jj = @jj + 1
          end
        set @ii = @ii + 1
        set @jj = 0
    end
    goCREATE TABLE 产品生产物料采购计划( 产品 varchar(10),产品规格 varchar(10),产量 decimal(28,6),材料 varchar(60),规格 varchar(60),单位 varchar(4),消耗 decimal(28,6),计划消耗 decimal(28,6))
    DECLARE @p产品 varchar(10)
    DECLARE @p产品规格 varchar(10)
    DECLARE @p产量 decimal(28,6)DECLARE  cp_Cursor CURSOR FOR
    select 产品,产品规格,产量 from 产品生产计划OPEN cp_Cursor
    FETCH NEXT FROM  cp_Cursor into @p产品,@p产品规格,@p产量WHILE @@FETCH_STATUS = 0
    BEGIN
           Insert Into 产品生产物料采购计划(产品,产品规格,产量,材料,消耗,计划消耗) select @p产品,@p产品规格,@p产量,bo.材料,bo.消耗,bo.消耗*@p产量 from bom单 bo where bo.产品=@p产品
           FETCH NEXT FROM cp_Cursor into @p产品,@p产品规格,@p产量
    END
    CLOSE cp_Cursor
    DEALLOCATE cp_Cursor
    GOdeclare @sqlhead varchar(8000)
    declare @sqlend varchar(8000)
    declare @sql1 varchar(8000)
    declare @sql2 varchar(8000)
    declare @sql3 varchar(8000)
    declare @sql4 varchar(8000)declare @sqlhead_ varchar(8000)
    declare @sqlend_ varchar(8000)
    declare @sql1_ varchar(8000)
    declare @sql2_ varchar(8000)
    declare @sql3_ varchar(8000)
    declare @sql4_ varchar(8000)declare @sqlhead_1 varchar(8000)
    declare @sqlend_1 varchar(8000)
    declare @sql1_1 varchar(8000)
    declare @sql2_1 varchar(8000)
    declare @sql3_1 varchar(8000)
    declare @sql4_1 varchar(8000)declare @i int
    declare @ic varchar(20)--生成数据处理临时表
    select id=identity(int,0,1),gid=0 ,a=',['+产品 +']=convert(varchar(10),sum(case 产品 when ''' +产品+''' then 计划消耗 else 0 end))'
    ,b=',['+产品 +']=convert(varchar(10),sum(case 产品 when ''' +产品+''' then 产量 else 0 end))',c=',['+产品 +']='''+产品规格+''''
    into # from(select distinct 产品,产品规格 from 产品生产物料采购计划) a order by 产品select @i=max(len(a)) from #
    print @i
    set @i=7800/@iupdate # set gid=id/@i
    select @i=max(gid) from #--生成数据处理语句
    select @sqlhead='''  union all select 材料,规格, 单位, 类别=''''计划消耗'''',
    convert(varchar(10),sum(计划消耗)) as 合计'''
    select @sqlend=''' from 产品生产物料采购计划 group by 材料,规格,单位'''
    select @sql1=''
    select @sql2='select '
    select @sql3=''
    select @sql4=''select @sqlhead_=''' union all select distinct 材料='''''''',规格='''''''', 单位='''''''', 类别=''''产品产量'''',
    convert(varchar(10),sum(产量)) as 合计__产品'''
    select @sqlend_=''' from 产品生产物料采购计划 group by 材料,规格,单位 '''
    select @sql1_=''
    select @sql2_='select '
    select @sql3_=''
    select @sql4_=''select @sqlhead_1='''select distinct 材料='''''''',规格='''''''', 单位='''''''', 类别=''''产品规格'''',
    '''''''' as 合计__产品'''
    select @sqlend_1=''' from 产品生产物料采购计划 group by 材料,规格,单位 '''
    select @sql1_1=''
    select @sql2_1='select '
    select @sql3_1=''
    select @sql4_1=''print @i
    while @i>=0
    begin
       select @ic=cast(@i as varchar),@i=@i-1  
       select @sql1='@'+@ic+' varchar(8000),'+@sql1
       select @sql2=@sql2+'@'+@ic+'='''','  
       select @sql3='select @'+@ic+'=@'+@ic+'+a from # where gid='+@ic+char(13)+@sql3  
       select @sql4=@sql4+',@'+@ic   select @sql1_='@_'+@ic+' varchar(8000),'+@sql1_
       select @sql2_=@sql2_+'@_'+@ic+'='''','  
       select @sql3_='select @_'+@ic+'=@_'+@ic+'+b from # where gid='+@ic+char(13)+@sql3_
       select @sql4_=@sql4_+',@_'+@ic
       
       select @sql1_1='@_'+@ic+'1 varchar(8000),'+@sql1_1
       select @sql2_1=@sql2_1+'@_'+@ic+'1='''','  
       select @sql3_1='select @_'+@ic+'1=@_'+@ic+'1 + c from # where gid='+@ic+char(13)+@sql3_1
       select @sql4_1=@sql4_1+',@_'+@ic+'1 '
    endselect @sql1='declare '+left(@sql1,len(@sql1)-1)+char(13) 
    select @sql2=left(@sql2,len(@sql2)-1)+char(13)
    select @sql3=left(@sql3,len(@sql3)-1) 
    select @sql4=substring(@sql4,2,8000)select @sql1_='declare '+left(@sql1_,len(@sql1_)-1)+char(13) 
    select @sql2_=left(@sql2_,len(@sql2_)-1)+char(13)
    select @sql3_=left(@sql3_,len(@sql3_)-1) 
    select @sql4_=substring(@sql4_,2,8000)select @sql1_1='declare '+left(@sql1_1,len(@sql1_1)-1)+char(13) 
    select @sql2_1=left(@sql2_1,len(@sql2_1)-1)+char(13)
    select @sql3_1=left(@sql3_1,len(@sql3_1)-1) 
    select @sql4_1=substring(@sql4_1,2,8000)
    --执行
    exec( 
    @sql1_+@sql2_+@sql3_+'
    '
    +@sql1+@sql2+@sql3+'
    '
    +@sql1_1+@sql2_1+@sql3_1+'
    exec('+@sqlhead_1+'+'+@sql4_1+'+'+@sqlend_1+'+'
    + @sqlhead_+'+'+@sql4_+'+'+@sqlend_+ ' + '
    +@sqlhead+'+'+@sql4+'+'+@sqlend + ')'
    )--删除临时表
    drop table #
    --*/
    godrop TABLE BOM单
    drop TABLE 产品生产计划
    drop TABLE 产品生产物料采购计划/*
    材料   规格    单位   类别    合计__产品     AA         AB         AC         ...
    ----- ------- ---- -------- ---------- ---------- ---------- ---------- ----
                       产品规格                AA_        AB_        AC_        ...
                       产品产量     390.000000 5.000000   5.000000   5.000000   ...
    a     NULL    NULL 计划消耗     780.000000 10.000000  10.000000  10.000000  ...
    b     NULL    NULL 计划消耗     780.000000 10.000000  10.000000  10.000000  ...
    c     NULL    NULL 计划消耗     780.000000 10.000000  10.000000  10.000000  ...*/
      

  7.   

    set nocount on
    CREATE TABLE BOM单(产品 varchar(10),材料 varchar(10),消耗 decimal(28,6))
    declare @i int
    declare @J int
    set @J = 0
    set @i = 0
    while @I < 4
    begin
       while @j < 26
          begin
              insert bom单 select char(65+@i)+char(65+@j),N'a',2
              insert bom单 select char(65+@i)+char(65+@j),N'b',2
              insert bom单 select char(65+@i)+char(65+@j),N'c',2
              set @j = @J + 1
          end
        set @i = @i + 1
        set @J = 0
    end
    go
    CREATE TABLE 产品生产计划( 产品 varchar(10),产品规格 varchar(10),产量 decimal(28,6))
    declare @ii int
    declare @jj int
    set @jj = 0
    set @ii = 0
    while @ii < 3
    begin
       while @jj < 26
          begin
              insert 产品生产计划 select char(65+@ii)+char(65+@jj),char(65+@ii)+char(65+@jj)+'_',5
              set @jj = @jj + 1
          end
        set @ii = @ii + 1
        set @jj = 0
    end
    goCREATE TABLE 产品生产物料采购计划( 产品 varchar(10),产品规格 varchar(10),产量 decimal(28,6),材料 varchar(60),规格 varchar(60),单位 varchar(4),消耗 decimal(28,6),计划消耗 decimal(28,6))
    DECLARE @p产品 varchar(10)
    DECLARE @p产品规格 varchar(10)
    DECLARE @p产量 decimal(28,6)DECLARE  cp_Cursor CURSOR FOR
    select 产品,产品规格,产量 from 产品生产计划OPEN cp_Cursor
    FETCH NEXT FROM  cp_Cursor into @p产品,@p产品规格,@p产量WHILE @@FETCH_STATUS = 0
    BEGIN
           Insert Into 产品生产物料采购计划(产品,产品规格,产量,材料,消耗,计划消耗) select @p产品,@p产品规格,@p产量,bo.材料,bo.消耗,bo.消耗*@p产量 from bom单 bo where bo.产品=@p产品
           FETCH NEXT FROM cp_Cursor into @p产品,@p产品规格,@p产量
    END
    CLOSE cp_Cursor
    DEALLOCATE cp_Cursor
    GOdeclare @sqlhead varchar(8000)
    declare @sqlend varchar(8000)
    declare @sql1 varchar(8000)
    declare @sql2 varchar(8000)
    declare @sql3 varchar(8000)
    declare @sql4 varchar(8000)declare @sqlhead_ varchar(8000)
    declare @sqlend_ varchar(8000)
    declare @sql1_ varchar(8000)
    declare @sql2_ varchar(8000)
    declare @sql3_ varchar(8000)
    declare @sql4_ varchar(8000)declare @sqlhead_1 varchar(8000)
    declare @sqlend_1 varchar(8000)
    declare @sql1_1 varchar(8000)
    declare @sql2_1 varchar(8000)
    declare @sql3_1 varchar(8000)
    declare @sql4_1 varchar(8000)declare @i int
    declare @ic varchar(20)--生成数据处理临时表
    select id=identity(int,0,1),gid=0 ,a=',['+产品 +']=convert(varchar(10),sum(case 产品 when ''' +产品+''' then 计划消耗 else 0 end))'
    ,b=',['+产品 +']=convert(varchar(10),sum(case 产品 when ''' +产品+''' then 产量 else 0 end))',c=',['+产品 +']='''+产品规格+''''
    into # from(select distinct 产品,产品规格 from 产品生产物料采购计划) a order by 产品select @i=max(len(a)) from #
    print @i
    set @i=7800/@iupdate # set gid=id/@i
    select @i=max(gid) from #--生成数据处理语句
    select @sqlhead='''  union all select 材料,规格, 单位, 类别=''''计划消耗'''',
    convert(varchar(10),sum(计划消耗)) as 合计'''
    select @sqlend=''' from 产品生产物料采购计划 group by 材料,规格,单位'''
    select @sql1=''
    select @sql2='select '
    select @sql3=''
    select @sql4=''select @sqlhead_=''' union all select distinct 材料='''''''',规格='''''''', 单位='''''''', 类别=''''产品产量'''',
    convert(varchar(10),sum(产量)) as 合计__产品'''
    select @sqlend_=''' from 产品生产物料采购计划 group by 材料,规格,单位 '''
    select @sql1_=''
    select @sql2_='select '
    select @sql3_=''
    select @sql4_=''select @sqlhead_1='''select distinct 材料='''''''',规格='''''''', 单位='''''''', 类别=''''产品规格'''',
    '''''''' as 合计__产品'''
    select @sqlend_1=''' from 产品生产物料采购计划 group by 材料,规格,单位 '''
    select @sql1_1=''
    select @sql2_1='select '
    select @sql3_1=''
    select @sql4_1=''print @i
    while @i>=0
    begin
       select @ic=cast(@i as varchar),@i=@i-1  
       select @sql1='@'+@ic+' varchar(8000),'+@sql1
       select @sql2=@sql2+'@'+@ic+'='''','  
       select @sql3='select @'+@ic+'=@'+@ic+'+a from # where gid='+@ic+char(13)+@sql3  
       select @sql4=@sql4+',@'+@ic   select @sql1_='@_'+@ic+' varchar(8000),'+@sql1_
       select @sql2_=@sql2_+'@_'+@ic+'='''','  
       select @sql3_='select @_'+@ic+'=@_'+@ic+'+b from # where gid='+@ic+char(13)+@sql3_
       select @sql4_=@sql4_+',@_'+@ic
       
       select @sql1_1='@_'+@ic+'1 varchar(8000),'+@sql1_1
       select @sql2_1=@sql2_1+'@_'+@ic+'1='''','  
       select @sql3_1='select @_'+@ic+'1=@_'+@ic+'1 + c from # where gid='+@ic+char(13)+@sql3_1
       select @sql4_1=@sql4_1+',@_'+@ic+'1 '
    endselect @sql1='declare '+left(@sql1,len(@sql1)-1)+char(13) 
    select @sql2=left(@sql2,len(@sql2)-1)+char(13)
    select @sql3=left(@sql3,len(@sql3)-1) 
    select @sql4=substring(@sql4,2,8000)select @sql1_='declare '+left(@sql1_,len(@sql1_)-1)+char(13) 
    select @sql2_=left(@sql2_,len(@sql2_)-1)+char(13)
    select @sql3_=left(@sql3_,len(@sql3_)-1) 
    select @sql4_=substring(@sql4_,2,8000)select @sql1_1='declare '+left(@sql1_1,len(@sql1_1)-1)+char(13) 
    select @sql2_1=left(@sql2_1,len(@sql2_1)-1)+char(13)
    select @sql3_1=left(@sql3_1,len(@sql3_1)-1) 
    select @sql4_1=substring(@sql4_1,2,8000)
    --执行
    exec( 
    @sql1_+@sql2_+@sql3_+'
    '
    +@sql1+@sql2+@sql3+'
    '
    +@sql1_1+@sql2_1+@sql3_1+'
    exec('+@sqlhead_1+'+'+@sql4_1+'+'+@sqlend_1+'+'
    + @sqlhead_+'+'+@sql4_+'+'+@sqlend_+ ' + '
    +@sqlhead+'+'+@sql4+'+'+@sqlend + ')'
    )--删除临时表
    drop table #
    --*/
    godrop TABLE BOM单
    drop TABLE 产品生产计划
    drop TABLE 产品生产物料采购计划/*
    材料   规格    单位   类别    合计__产品     AA         AB         AC         ...
    ----- ------- ---- -------- ---------- ---------- ---------- ---------- ----
                       产品规格                AA_        AB_        AC_        ...
                       产品产量     390.000000 5.000000   5.000000   5.000000   ...
    a     NULL    NULL 计划消耗     780.000000 10.000000  10.000000  10.000000  ...
    b     NULL    NULL 计划消耗     780.000000 10.000000  10.000000  10.000000  ...
    c     NULL    NULL 计划消耗     780.000000 10.000000  10.000000  10.000000  ...*/
      

  8.   

    set nocount on
    CREATE TABLE BOM单(产品 varchar(10),材料 varchar(10),消耗 decimal(28,6))
    declare @i int
    declare @J int
    set @J = 0
    set @i = 0
    while @I < 4
    begin
       while @j < 26
          begin
              insert bom单 select char(65+@i)+char(65+@j),N'a',2
              insert bom单 select char(65+@i)+char(65+@j),N'b',2
              insert bom单 select char(65+@i)+char(65+@j),N'c',2
              set @j = @J + 1
          end
        set @i = @i + 1
        set @J = 0
    end
    go
    CREATE TABLE 产品生产计划( 产品 varchar(10),产品规格 varchar(10),产量 decimal(28,6))
    declare @ii int
    declare @jj int
    set @jj = 0
    set @ii = 0
    while @ii < 3
    begin
       while @jj < 26
          begin
              insert 产品生产计划 select char(65+@ii)+char(65+@jj),char(65+@ii)+char(65+@jj)+'_',5
              set @jj = @jj + 1
          end
        set @ii = @ii + 1
        set @jj = 0
    end
    goCREATE TABLE 产品生产物料采购计划( 产品 varchar(10),产品规格 varchar(10),产量 decimal(28,6),材料 varchar(60),规格 varchar(60),单位 varchar(4),消耗 decimal(28,6),计划消耗 decimal(28,6))
    DECLARE @p产品 varchar(10)
    DECLARE @p产品规格 varchar(10)
    DECLARE @p产量 decimal(28,6)DECLARE  cp_Cursor CURSOR FOR
    select 产品,产品规格,产量 from 产品生产计划OPEN cp_Cursor
    FETCH NEXT FROM  cp_Cursor into @p产品,@p产品规格,@p产量WHILE @@FETCH_STATUS = 0
    BEGIN
           Insert Into 产品生产物料采购计划(产品,产品规格,产量,材料,消耗,计划消耗) select @p产品,@p产品规格,@p产量,bo.材料,bo.消耗,bo.消耗*@p产量 from bom单 bo where bo.产品=@p产品
           FETCH NEXT FROM cp_Cursor into @p产品,@p产品规格,@p产量
    END
    CLOSE cp_Cursor
    DEALLOCATE cp_Cursor
    GOdeclare @sqlhead varchar(8000)
    declare @sqlend varchar(8000)
    declare @sql1 varchar(8000)
    declare @sql2 varchar(8000)
    declare @sql3 varchar(8000)
    declare @sql4 varchar(8000)declare @sqlhead_ varchar(8000)
    declare @sqlend_ varchar(8000)
    declare @sql1_ varchar(8000)
    declare @sql2_ varchar(8000)
    declare @sql3_ varchar(8000)
    declare @sql4_ varchar(8000)declare @sqlhead_1 varchar(8000)
    declare @sqlend_1 varchar(8000)
    declare @sql1_1 varchar(8000)
    declare @sql2_1 varchar(8000)
    declare @sql3_1 varchar(8000)
    declare @sql4_1 varchar(8000)declare @i int
    declare @ic varchar(20)--生成数据处理临时表
    select id=identity(int,0,1),gid=0 ,a=',['+产品 +']=convert(varchar(10),sum(case 产品 when ''' +产品+''' then 计划消耗 else 0 end))'
    ,b=',['+产品 +']=convert(varchar(10),sum(case 产品 when ''' +产品+''' then 产量 else 0 end))',c=',['+产品 +']='''+产品规格+''''
    into # from(select distinct 产品,产品规格 from 产品生产物料采购计划) a order by 产品select @i=max(len(a)) from #
    print @i
    set @i=7800/@iupdate # set gid=id/@i
    select @i=max(gid) from #--生成数据处理语句
    select @sqlhead='''  union all select 材料,规格, 单位, 类别=''''计划消耗'''',
    convert(varchar(10),sum(计划消耗)) as 合计'''
    select @sqlend=''' from 产品生产物料采购计划 group by 材料,规格,单位'''
    select @sql1=''
    select @sql2='select '
    select @sql3=''
    select @sql4=''select @sqlhead_=''' union all select distinct 材料='''''''',规格='''''''', 单位='''''''', 类别=''''产品产量'''',
    convert(varchar(10),sum(产量)) as 合计__产品'''
    select @sqlend_=''' from 产品生产物料采购计划 group by 材料,规格,单位 '''
    select @sql1_=''
    select @sql2_='select '
    select @sql3_=''
    select @sql4_=''select @sqlhead_1='''select distinct 材料='''''''',规格='''''''', 单位='''''''', 类别=''''产品规格'''',
    '''''''' as 合计__产品'''
    select @sqlend_1=''' from 产品生产物料采购计划 group by 材料,规格,单位 '''
    select @sql1_1=''
    select @sql2_1='select '
    select @sql3_1=''
    select @sql4_1=''print @i
    while @i>=0
    begin
       select @ic=cast(@i as varchar),@i=@i-1  
       select @sql1='@'+@ic+' varchar(8000),'+@sql1
       select @sql2=@sql2+'@'+@ic+'='''','  
       select @sql3='select @'+@ic+'=@'+@ic+'+a from # where gid='+@ic+char(13)+@sql3  
       select @sql4=@sql4+',@'+@ic   select @sql1_='@_'+@ic+' varchar(8000),'+@sql1_
       select @sql2_=@sql2_+'@_'+@ic+'='''','  
       select @sql3_='select @_'+@ic+'=@_'+@ic+'+b from # where gid='+@ic+char(13)+@sql3_
       select @sql4_=@sql4_+',@_'+@ic
       
       select @sql1_1='@_'+@ic+'1 varchar(8000),'+@sql1_1
       select @sql2_1=@sql2_1+'@_'+@ic+'1='''','  
       select @sql3_1='select @_'+@ic+'1=@_'+@ic+'1 + c from # where gid='+@ic+char(13)+@sql3_1
       select @sql4_1=@sql4_1+',@_'+@ic+'1 '
    endselect @sql1='declare '+left(@sql1,len(@sql1)-1)+char(13) 
    select @sql2=left(@sql2,len(@sql2)-1)+char(13)
    select @sql3=left(@sql3,len(@sql3)-1) 
    select @sql4=substring(@sql4,2,8000)select @sql1_='declare '+left(@sql1_,len(@sql1_)-1)+char(13) 
    select @sql2_=left(@sql2_,len(@sql2_)-1)+char(13)
    select @sql3_=left(@sql3_,len(@sql3_)-1) 
    select @sql4_=substring(@sql4_,2,8000)select @sql1_1='declare '+left(@sql1_1,len(@sql1_1)-1)+char(13) 
    select @sql2_1=left(@sql2_1,len(@sql2_1)-1)+char(13)
    select @sql3_1=left(@sql3_1,len(@sql3_1)-1) 
    select @sql4_1=substring(@sql4_1,2,8000)
    --执行
    exec( 
    @sql1_+@sql2_+@sql3_+'
    '
    +@sql1+@sql2+@sql3+'
    '
    +@sql1_1+@sql2_1+@sql3_1+'
    exec('+@sqlhead_1+'+'+@sql4_1+'+'+@sqlend_1+'+'
    + @sqlhead_+'+'+@sql4_+'+'+@sqlend_+ ' + '
    +@sqlhead+'+'+@sql4+'+'+@sqlend + ')'
    )--删除临时表
    drop table #
    --*/
    godrop TABLE BOM单
    drop TABLE 产品生产计划
    drop TABLE 产品生产物料采购计划/*
    材料   规格    单位   类别    合计__产品     AA         AB         AC         ...
    ----- ------- ---- -------- ---------- ---------- ---------- ---------- ----
                       产品规格                AA_        AB_        AC_        ...
                       产品产量     390.000000 5.000000   5.000000   5.000000   ...
    a     NULL    NULL 计划消耗     780.000000 10.000000  10.000000  10.000000  ...
    b     NULL    NULL 计划消耗     780.000000 10.000000  10.000000  10.000000  ...
    c     NULL    NULL 计划消耗     780.000000 10.000000  10.000000  10.000000  ...*/
      

  9.   

    http://community.csdn.net/Expert/topic/4583/4583782.xml?temp=.8999903