我想从多行中减去一行。我需要获得剩余数量(由BusTransaction_ID和Artikl区分,并按X_PDateMonth $ DATE排序),这是此减法的结果:
预期结果:
结果可以带或不带“零行”。我不知道,如何完成这个结果。并且会更好地使用一些“存储过程”或什么,因为它将用于一个非常大的数据集?
感谢所有回复。
答案 0 :(得分:1)
这将使用分析函数为您提供“零行”的结果:
select x.*,
case
when subqty >= runner
then 0
when runner > subqty
and lag(runner, 1) over( partition by bustransaction_id, artikl
order by bustransaction_id, artikl, xpldate ) > subqty
then quantity
else runner - subqty
end as chk
from (select s.bustransaction_id,
s.artikl,
s.xpldate,
s.quantity,
sum(s.quantity) over( partition by s.bustransaction_id, s.artikl
order by s.bustransaction_id, s.artikl, s.xpldate ) as runner,
z.quantity as subqty
from start_table s
join subtract_table z
on s.bustransaction_id = z.bustransaction_id
and s.artikl = z.artikl) x
order by bustransaction_id, artikl, xpldate
小提琴: http://sqlfiddle.com/#!6/20987/1/0
CASE语句与LAG功能相结合,可识别第一个“半耗尽”行,这是计算中最大的一行。
在那个小提琴中,我包含了我的派生列,这些列是获得你想要的东西所必需的。如果您不想显示这些列,只需从内嵌视图中选择所需的列,如下所示:http://sqlfiddle.com/#!6/20987/2/0
答案 1 :(得分:1)
以下是通过执行以下操作的解决方案:
查询如下所示:
select t.bustransaction_id, t.artikl, t.xpldate,
(case when cumeq <= subt.quantity then 0
when cumeq - t.quantity <= subt.quantity
then cumeq - subt.quantity
else t.quantity
end) as newquantity
from (select t.*,
sum(quantity) over (partition by bustransaction_id, artikl order by xpldate) as cumeq
from start_table t
) t left join
subtract_table subt
on t.bustransaction_id = subt.bustransaction_id and
t.artikl = subt.artikl
order by t.bustransaction_id, t.artikl, t.xpldate;
Here是SQL Fiddle(基于Brians)。