有表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)
产品 需要时间 需要数量
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)
在表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
楼主自己把建表语句贴出来就好了
要都写在一条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