建立环境
declare @tb1 table
(
  [产品类别] varchar(10),
  [产品编号] varchar(10)
)
insert @tb1
select 'A','A1' union
select 'A','A2' union
select 'A','A3' union
select 'A','A4' union
select 'A','A5' union
select 'B','B1' union
select 'B','B2' union
select 'B','B3' union
select 'B','B4' union
select 'B','B5'select * from @tb1declare @tb2 table
(
  [出货单号] varchar(10),
  [产品类别] varchar(10),
  [数量] varchar(10)
)
insert @tb2
select '1','A','3' union
select '1','B','2' select * from @tb2

解决方案 »

  1.   

    --生成测试书库
    create table 产品表(产品类别 char(1),产品编号 char(2))
    insert into 产品表 select 'A','A1'
    insert into 产品表 select 'A','A2'
    insert into 产品表 select 'A','A3'
    insert into 产品表 select 'A','A4'
    insert into 产品表 select 'A','A5'
    insert into 产品表 select 'B','B1'
    insert into 产品表 select 'B','B2'
    insert into 产品表 select 'B','B3'
    insert into 产品表 select 'B','B4'
    insert into 产品表 select 'B','B5'create table 出货表(出货单号 int,产品类别 char(1),数量 int)
    insert into 出货表 select 1,'A',3
    insert into 出货表 select 1,'B',2--执行查询
    select 
        a.出货单号,
        b.产品编号 
    from
        出货表 a,
        产品表 b
    where
        a.产品类别 = b.产品类别 
        and 
        (select count(*) from 产品表 c where 产品类别=a.产品类别 and 产品编号>=b.产品编号)<=a.数量--输出结果
    出货单号  产品编号
    --------  --------
    1         A1
    1         A2
    1         A3
    1         B1
    1         B2
      

  2.   

    create table [产品表]
    (
      [产品类别] varchar(10),
      [产品编号] varchar(10)
    )
    create table [出货表]
    (
      [出货单号] int,
      [产品类别] varchar(10),
      [数量]     int
    )
    insert [产品表]
    select 'A','A1' union
    select 'A','A2' union
    select 'A','A3' union
    select 'A','A4' union
    select 'A','A5' union
    select 'B','B1' union
    select 'B','B2' union
    select 'B','B3' union
    select 'B','B4' union
    select 'B','B5'
    insert [出货表]
    select 1,'A',3 union
    select 1,'B',2--测试
    declare @sql varchar(5000)
    set @sql=''
    select @sql=@sql+' union all select top '+convert(varchar,[数量])+' * from [产品表] where [产品类别]='''+[产品类别]+''''
    from [出货表]
    set @sql=stuff(@sql,1,10,'')
    --print @sql
    exec(@sql)--删除测试环境
    drop table [产品表],[出货表]--结果
    /*
    产品类别       产品编号       
    ---------- ---------- 
    A          A1
    A          A2
    A          A3
    B          B1
    B          B2
    */
      

  3.   

    declare @sql varchar(8000)
    declare @lb varchar(5)
    declare @sl int
    declare @tmp int
    DECLARE cur_ck CURSOR FOR select 产品类别,数量 FROM 出货表 WHERE 出货单号 = '1'
    OPEN cur_ck 
    FETCH NEXT FROM cur_ck INTO @lb,@sl
    set @tmp = 0
    WHILE @@FETCH_STATUS = 0
    BEGIN
    if (@tmp = 0)
    begin
    set @sql = 'select top ' + cast(@sl as varchar(5)) + ' ' + cast(@sl as varchar(5)) + ' 出货单号,产品编号 from 产品表 a where a.产品类别 = ''' + @lb + ''''
    set @tmp = 1
    end
    else
    begin
    set @sql = ' UNION select top ' + cast(@sl as varchar(5)) + ' ' + cast(@sl as varchar(5)) + ' 出货单号,产品编号 from 产品表 a where a.产品类别 = ''' + @lb + ''''
    end
    FETCH NEXT FROM cur_ck INTO @lb,@sl
    endexec(@sql)
    没测试,你试一下,主要思路是用游标取出货表中的单号为指定号码的数据,动态生成select语句,用exec方法执行
      

  4.   

    引用vivianfdlpw() 兄弟
    declare @sql varchar(5000)
    declare @bb varchar(5)
    set @sql=''
    select @bb=[出货单号], @sql=@sql+' union all select top '+convert(varchar,[数量])+' '+@bb+' 出货单号,[产品编号] from [产品表] where [产品类别]='''+[产品类别]+''''
    from [出货表] a where [出货单号] = '1'
    set @sql=stuff(@sql,1,10,'')
    --print @sql
    exec(@sql)