有表1内容如下
产品  需要时间   需要数量
A      1/10     -200
A      1/20     -300
B      1/5      -100
B      1/15     -150
表2内容如下
产品   供应时间   供应数量
A      3/1       100
A      3/3       600
B      3/10      500
通过什么SQL语句可以得到表3的内容
产品  需要时间   需要数量    供应
A      1/10     -200      3/1(100);3/3(100)    
A      1/20     -300      3/3(300)
B      1/5      -100      3/10(100)
B      1/15     -150      3/10(150)

解决方案 »

  1.   

    先进先出吧?参考这个:我有数m=10,想对表中的某个字段数进行减少,直到我提供的数为0 
    在表pp(id,num,week) 
    假设表有数据 
    1 3 2 
    2 2 2 
    3 1 3 
    4 1 5 
    5 8 3 我希望执行一个语句,就是字段num减少,到0为至,如果是表格中数据的最后一行允许为负。例如m=10,执行后的结果表是: 
    1 0 2 
    2 0 2 
    3 0 3 
    4 0 5 
    5 5 3 如果m=20,最前面的数据执行语句后表格是: 
    1 0 2 
    2 0 2 
    3 0 3 
    4 0 5 
    5 -5 3 请高手指点,谢谢!! 
    create table pp(id int,num int,week int)
    insert into pp values(1, 3, 2 )
    insert into pp values(2, 2, 2 )
    insert into pp values(3, 1, 3 )
    insert into pp values(4, 1, 5 )
    insert into pp values(5, 8, 3 )
    go
    declare @m as intset @m = 10
    select id , num = case when (select sum(num) from pp where id <= t.id) - @m <= 0 and id <> (select max(id) from pp) then 0 else (select sum(num) from pp where id <= t.id) - @m end , week from pp t
    /*
    id          num         week        
    ----------- ----------- ----------- 
    1           0           2
    2           0           2
    3           0           3
    4           0           5
    5           5           3(所影响的行数为 5 行)
    */set @m = 20
    select id , num = case when (select sum(num) from pp where id <= t.id) - @m <= 0 and id <> (select max(id) from pp) then 0 else (select sum(num) from pp where id <= t.id) - @m end , week from pp t
    /*
    id          num         week        
    ----------- ----------- ----------- 
    1           0           2
    2           0           2
    3           0           3
    4           0           5
    5           -5          3(所影响的行数为 5 行)
    */drop table pp
      

  2.   

    就是两张表join一下就好了啊,没什么特别的。
    楼主自己把建表语句贴出来就好了
      

  3.   

    估计这得用存储过程之类的来做比较简单吧,
    要都写在一条SQL语句里的话显得有点挤。给你找个搞笑的看看:create table 表1(产品 varchar(50),  需要时间 varchar(50),  需要数量 int)
    insert 表1 select 'A',      '1/10',    200
    insert 表1 select 'A',      '1/20',    300
    insert 表1 select 'B',      '1/05',    100
    insert 表1 select 'B',      '1/15',    150
    insert 表1 select 'A',      '1/21',    200
    insert 表1 select 'A',      '1/22',    300
    create table 表2(产品 varchar(50),  供应时间 varchar(50),  供应数量 int)
    insert 表2 select 'A',      '3/01',    100
    insert 表2 select 'A',      '3/03',    600
    insert 表2 select 'B',      '3/10',    500
    select * from 表1 select * from 表2
    ;with 
    a as(select 产品,需要时间,需要数量,累计需要数量=(select isnull(sum(需要数量),0) from 表1 where 产品=A.产品 and 需要时间<A.需要时间) from 表1 A),
    b as(select 产品,供应时间,供应数量,累计供应数量=(select isnull(sum(供应数量),0) from 表2 where 产品=B.产品 and 供应时间<B.供应时间) from 表2 B),
    c as(select (select top 1 供应数量+累计供应数量 from b where 产品=a.产品 and 供应数量+累计供应数量>累计需要数量 order by 累计供应数量) lastM,(select top 1 供应数量+累计供应数量 from b where 产品=a.产品 and 供应数量+累计供应数量>=需要数量+累计需要数量 order by 累计供应数量 ) firstM,* from a),
    d as(select c.产品,需要时间,需要数量,供应时间,供应数量=case when 供应数量<需要数量+累计需要数量-累计供应数量 then 供应数量 when 需要数量<需要数量+累计需要数量-累计供应数量 then 需要数量 when 需要数量+累计需要数量<供应数量+累计供应数量 then 需要数量+累计需要数量-累计供应数量 else 0 end from c outer apply (select * from b where 产品=c.产品 and b.供应数量+b.累计供应数量 between c.lastM and c.firstM)e)
    --select * from a
    --select * from b
    --select * from c
    --select * from d
    select *,供应=stuff((select ';'+供应时间+'('+cast(供应数量 as varchar(10))+')' from d where 产品=ad.产品 and 需要时间=ad.需要时间 order by 供应时间  for xml path('')),1,1,'') from 表1 ad order by 1,2
    drop table 表1 drop table 表2