在一个相当简单的数据库(Firebird 3.0)中,我有一个库存表,其中包含与产品相关的字段:
购买
QTY PRICE VALUE Date
10 10 100 1.12.2018
25 9 225 5.12.2018
30 8 240 12.12.2018
50 7 350 14.12.2018
100 6 600 22.12.2018
总计(数量,价格,价值):215、40、1515
在这里,已售数量为150,我需要对“购买”中最早的记录求和(值),直到sum(QTY) = SOLD QTY
。
答案 0 :(得分:1)
使用Firebird 3支持的 Windowed Aggregates 可以轻松解决此问题。
select *
,case when cumulative_qty <= sold_qty then qty
when sold_qty-(cumulative_qty - qty) < 0 then 0
else sold_qty-(cumulative_qty - qty)
end as qty_sold
,case when cumulative_qty <= sold_qty then qty
when sold_qty-(cumulative_qty - qty) < 0 then 0
else sold_qty-(cumulative_qty - qty)
end * price as value_sold
from
(
select *
,150 as sold_qty
-- cumulative sum of quantity in stock (FIFO)
,sum(qty) over (order by date rows unbounded preceding) as cumulative_qty
from tab
) as dt
;
现在您可以计算总和:
select
sum(case when cumulative_qty <= sold_qty then qty
when sold_qty-(cumulative_qty - qty) < 0 then 0
else sold_qty-(cumulative_qty - qty)
end) as qty_sold
,sum(case when cumulative_qty <= sold_qty then qty
when sold_qty-(cumulative_qty - qty) < 0 then 0
else sold_qty-(cumulative_qty - qty)
end * price) as value_sold
from
(
select *
,150 as sold_qty
-- cumulative sum of quantity in stock (FIFO)
,sum(qty) over (order by date rows unbounded preceding) as cumulative_qty
from tab
) as dt
;
请参见db<>fiddle(使用Postgres,但Firebird语法应相同)