SQL查询-需要帮助形成SQL查询吗
请有人能告诉我以下问题:我需要下面的SQL查询解决方案。数据库是oracle11gSQL查询-需要帮助形成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
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