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

解决方案 »

  1.   

    --写多了一些字段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
      

  2.   

    --测试--测试数据
    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 行)
    --*/
      

  3.   

    多谢zjcxc(: 邹建 :) 现在有一个问题,如果物品1实际入库为80的话,实际的数量就不正确了。这是你查出的结果
    物品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  ---这里不正确。应该如何写呢?多谢指点
      

  4.   

    --测试--测试数据
    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 行)
    --*/
      

  5.   

    是正常的。你写的SQL没有问题。物品1        2004-01-01 10          10
    物品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个
      

  6.   

    现在的结果能写出来吗,如果能产生现在的结果就OK了是这样的一列         二列                  三列 
    物品1        2004-01-01 10          10  这里没有问题, 取计划量
    物品1        2004-01-05 20          20  这里没有问题, 取计划量
    物品1        2004-01-10 30          30  这里按照你的SQL,取得还是计划量30,应该是实际总入库量80-累计计划量30 = 50不是我说明白没有
      

  7.   

    谢谢 zjcxc(: 邹建 :) 问题已经解决了