select 物品名称,计划入库时间=convert(varchar(10),计划入库时间,120),数量
,实际数量,累计数量
,实际完成数量=case when 累计数量+数量<=实际数量 then 数量
else case when 实际数量-累计数量>0 then 实际数量-累计数量 else 0 end end
from(
select a.* ,累计数量=isnull((
select sum(数量) from 计划
where 物品名称=a.物品名称
and 计划入库时间<a.计划入库时间),0)
,实际数量=b.数量
from 计划 a join(
select 物品名称,数量=sum(数量)
from 实际入库
group by 物品名称
)b on a.物品名称=b.物品名称
)a
,实际完成数量=case when 累计数量+数量<=实际数量 then 数量
else case when 实际数量-累计数量>0 then 实际数量-累计数量 else 0 end end
from(
select a.* ,累计数量=isnull((
select sum(数量) from 计划
where 物品名称=a.物品名称
and 计划入库时间<a.计划入库时间),0)
,实际数量=b.数量
from 计划 a join(
select 物品名称,数量=sum(数量)
from 实际入库
group by 物品名称
)b on a.物品名称=b.物品名称
)a
create table 计划(物品名称 varchar(10),计划入库时间 datetime,数量 int)
insert 计划 select '物品1','2004-1-1',10
union all select '物品1','2004-1-5',20
union all select '物品1','2004-1-10',30
union all select '物品2','2004-1-2',20
union all select '物品2','2004-1-3',10
union all select '物品3','2004-1-1',40create table 实际入库(物品名称 varchar(10),实际入库日期 datetime,数量 int)
insert 实际入库 select '物品1','2004-1-1',20
union all select '物品1','2004-1-5',20
union all select '物品2','2004-1-10',10
union all select '物品3','2004-1-2',60
goselect 物品名称,计划入库时间=convert(char(10),计划入库时间,120),数量
,实际完成数量=case when 累计数量+数量<=实际数量 then 数量
else case when 实际数量-累计数量>0 then 实际数量-累计数量 else 0 end end
from(
select a.* ,累计数量=isnull((
select sum(数量) from 计划
where 物品名称=a.物品名称
and 计划入库时间<a.计划入库时间),0)
,实际数量=b.数量
from 计划 a join(
select 物品名称,数量=sum(数量)
from 实际入库
group by 物品名称
)b on a.物品名称=b.物品名称
)a
go--删除测试
drop table 计划,实际入库/*--测试结果
物品名称 计划入库时间 数量 实际完成数量
---------- ---------- ----------- -----------
物品1 2004-01-01 10 10
物品1 2004-01-05 20 20
物品1 2004-01-10 30 10
物品2 2004-01-02 20 10
物品2 2004-01-03 10 0
物品3 2004-01-01 40 40(所影响的行数为 6 行)
--*/
物品1 2004-01-01 10 10
物品1 2004-01-05 20 20
物品1 2004-01-10 30 10要求查询的结果为
物品1 2004-01-01 10 10
物品1 2004-01-05 20 20
物品1 2004-01-10 30 50 ---这里不正确。应该如何写呢?多谢指点
create table 计划(物品名称 varchar(10),计划入库时间 datetime,数量 int)
insert 计划 select '物品1','2004-1-1',10
union all select '物品1','2004-1-5',20
union all select '物品1','2004-1-10',30
union all select '物品2','2004-1-2',20
union all select '物品2','2004-1-3',10
union all select '物品3','2004-1-1',40create table 实际入库(物品名称 varchar(10),实际入库日期 datetime,数量 int)
insert 实际入库 select '物品1','2004-1-1',80
union all select '物品1','2004-1-5',80
union all select '物品2','2004-1-10',10
union all select '物品3','2004-1-2',60
goselect 物品名称,计划入库时间=convert(char(10),计划入库时间,120),数量
,实际完成数量=case when 累计数量+数量<=实际数量 then 数量
else case when 实际数量-累计数量>0 then 实际数量-累计数量 else 0 end end
from(
select a.* ,累计数量=isnull((
select sum(数量) from 计划
where 物品名称=a.物品名称
and 计划入库时间<a.计划入库时间),0)
,实际数量=b.数量
from 计划 a join(
select 物品名称,数量=sum(数量)
from 实际入库
group by 物品名称
)b on a.物品名称=b.物品名称
)a
go--删除测试
drop table 计划,实际入库/*--测试结果物品名称 计划入库时间 数量 实际完成数量
---------- ---------- ----------- -----------
物品1 2004-01-01 10 10
物品1 2004-01-05 20 20
物品1 2004-01-10 30 30 --不会啊这里正常啊
物品2 2004-01-02 20 10
物品2 2004-01-03 10 0
物品3 2004-01-01 40 40(所影响的行数为 6 行)
--*/
物品1 2004-01-05 20 20
物品1 2004-01-10 30 30 -- 这里应该是剩下的实际数量。不是计划数量不知道你明白我的意思没有例子:
物品1实际入库合计 80那结果应该是物品1 2004-01-01 10 10
物品1 2004-01-05 20 20
物品1 2004-01-10 30 50 应该是50 -- 80 - 累计计划量 30 剩50个
物品1 2004-01-01 10 10 这里没有问题, 取计划量
物品1 2004-01-05 20 20 这里没有问题, 取计划量
物品1 2004-01-10 30 30 这里按照你的SQL,取得还是计划量30,应该是实际总入库量80-累计计划量30 = 50不是我说明白没有