SQL查询-需要帮助形成SQL查询吗

SQL查询-需要帮助形成SQL查询吗,sql,oracle11g,Sql,Oracle11g,请有人能告诉我以下问题:我需要下面的SQL查询解决方案。数据库是oracle11g Select article_cd, dc_cd, nvl(soh_to_dmp - least(soh_to_dmp, nvl(sum(adj_alc_tot_frcst), 0)) ,0) v_dump_qty, used_by_date from inventory 我附上了一个屏幕截图,以表的形式显示数据 我想要一个列shirink,它给出dump qty-su

请有人能告诉我以下问题:我需要下面的SQL查询解决方案。数据库是oracle11g

Select 
    article_cd, dc_cd, 
    nvl(soh_to_dmp - least(soh_to_dmp, nvl(sum(adj_alc_tot_frcst), 0)) ,0) v_dump_qty,
    used_by_date 
from 
    inventory 
我附上了一个屏幕截图,以表的形式显示数据


我想要一个列shirink,它给出dump qty-sum all previous shrink,如果dump qty-sum all previous shrink,那么下面的查询可能会为解决您的问题提供一个起点。我们现在没有很多测试数据。但是,当我们使用充满测试数据的库存表时,如下所示:

create table inventory(
  iid number primary key
, usebydate date
, qty number
);
-- select * from inventory
IID USEBYDATE   QTY
1   30-AUG-2017 0
2   31-AUG-2017 0
3   30-SEP-2017 777
4   30-OCT-2017 0
5   01-NOV-2017 0
6   16-NOV-2017 0
7   30-NOV-2017 0
8   01-JAN-2018 0
9   31-JAN-2018 2548
10  28-FEB-2018 8356
。。。可以看出,包含自联接的查询,结合大小写和窗口,可以提供所需的结果

select 
  i.iid
, i.qty 
, case 
    when ( i.qty - ( sum(i2.shrink) over ( order by i.iid rows between unbounded preceding and 1 preceding) ) ) < 0 
      or ( i.qty - ( sum(i2.shrink) over ( order by i.iid rows between unbounded preceding and 1 preceding) ) ) is null
      then 0
    else ( i.qty - ( sum(i2.shrink) over ( order by i.iid rows between unbounded preceding and 1 preceding) ) )
  end shrink 
from inventory i join 
  ( select 
      iid
    , case 
        when ( qty - ( sum(qty) 
          over ( order by iid rows between unbounded preceding and 1 preceding ) ) ) < 0 then 0
        else ( qty - ( sum(qty) 
              over ( order by iid rows between unbounded preceding and 1 preceding) ) )
       end shrink
       from inventory
   ) i2
   on i.iid = i2.iid
order by i.iid
;
相同的查询,在ON子句中包含usebydate,为我们提供:

-- -----------------------------------------------------------------------------
--  on clause with date instead of iid
-- -----------------------------------------------------------------------------
select 
  i.usebydate
, i.qty 
, case 
    when ( i.qty - ( sum(i2.shrink) over ( order by i.usebydate rows between unbounded preceding and 1 preceding) ) ) < 0 
      or ( i.qty - ( sum(i2.shrink) over ( order by i.usebydate rows between unbounded preceding and 1 preceding) ) ) is null
      then 0
    else ( i.qty - ( sum(i2.shrink) over ( order by i.usebydate rows between unbounded preceding and 1 preceding) ) )
  end shrink 
from inventory i join 
  ( select 
      usebydate
    , case 
        when ( qty - ( sum(qty) 
          over ( order by usebydate rows between unbounded preceding and 1 preceding ) ) ) < 0 then 0
        else ( qty - ( sum(qty) 
              over ( order by usebydate rows between unbounded preceding and 1 preceding) ) )
       end shrink
       from inventory
   ) i2
   on i.usebydate = i2.usebydate
order by i.usebydate
;

-- output
    USEBYDATE   QTY     SHRINK
    30-AUG-2017 0       0
    31-AUG-2017 0       0
    30-SEP-2017 777     777
    30-OCT-2017 0       0
    01-NOV-2017 0       0
    16-NOV-2017 0       0
    30-NOV-2017 0       0
    01-JAN-2018 0       0
    31-JAN-2018 2548    1771
    28-FEB-2018 8356    5808

我相信这是可以修改/简化的。此外,它还需要彻底的测试。与Oracle 12c、Oracle 11g R2合作。dbfiddle

如果您的数据库引擎支持该语句,则该语句可能会有所帮助。你在使用什么数据库?1用你正在使用的数据库标记你的问题。2提供语法正确的SQL查询。无论代码如何,您确定逻辑的数学正确吗?从逻辑的角度来看,您尝试实现的公式对我来说没有多大意义-与编程无关。我的问题是如何为列shirnk形成一个公式,其中它查找上一个shink,并从shirnk中减去,然后将计算出的收缩考虑到下一个收缩?我现在知道为什么逻辑上是不正确的了。很抱歉回复得太晚,非常感谢你的帮助。第二天就解决了,我的同事帮我解答了这个问题。我错过了你的答案,我没有从这个论坛得到任何更新。非常感谢你的帮助。我从中学到了很多answer@user361245谢谢你的反馈!非常感谢。
IID QTY     SHRINK
1   0       0
2   0       0
3   777     777
4   0       0
5   0       0
6   0       0
7   0       0
8   0       0
9   2548    1771
10  8356    5808
-- -----------------------------------------------------------------------------
--  on clause with date instead of iid
-- -----------------------------------------------------------------------------
select 
  i.usebydate
, i.qty 
, case 
    when ( i.qty - ( sum(i2.shrink) over ( order by i.usebydate rows between unbounded preceding and 1 preceding) ) ) < 0 
      or ( i.qty - ( sum(i2.shrink) over ( order by i.usebydate rows between unbounded preceding and 1 preceding) ) ) is null
      then 0
    else ( i.qty - ( sum(i2.shrink) over ( order by i.usebydate rows between unbounded preceding and 1 preceding) ) )
  end shrink 
from inventory i join 
  ( select 
      usebydate
    , case 
        when ( qty - ( sum(qty) 
          over ( order by usebydate rows between unbounded preceding and 1 preceding ) ) ) < 0 then 0
        else ( qty - ( sum(qty) 
              over ( order by usebydate rows between unbounded preceding and 1 preceding) ) )
       end shrink
       from inventory
   ) i2
   on i.usebydate = i2.usebydate
order by i.usebydate
;

-- output
    USEBYDATE   QTY     SHRINK
    30-AUG-2017 0       0
    31-AUG-2017 0       0
    30-SEP-2017 777     777
    30-OCT-2017 0       0
    01-NOV-2017 0       0
    16-NOV-2017 0       0
    30-NOV-2017 0       0
    01-JAN-2018 0       0
    31-JAN-2018 2548    1771
    28-FEB-2018 8356    5808