我想在hana工作室制作一个计算视图,我必须在库存中保持待定产品的老化。
它将在先到先减的基础上减去...... 我的意思是在产品P001的情况下,然后5500将先减去1000然后平衡数量将减去2000,依此类推,直到它为零.. 以下是交易表..
Department |Product | Date | Quantity |Indicator
------------+---------+--------------------+-----------+---------
D001 |P001 | 01-Jul-2017 | 1000 |ADD
D001 |P001 | 10-Jul-2017 | 2000 |ADD
D001 |P001 | 15-Jul-2017 | 3000 |ADD
D001 |P001 | 16-Jul-2017 | 2000 |ADD
D001 |P001 | 18-Jul-2017 | 5500 |SUBTRACT
D001 |P002 | 12-Jul-2017 | 3000 |ADD
D001 |P002 | 14-Jul-2017 | 2000 |ADD
D001 |P002 | 15-Jul-2017 | 4000 |SUBTRACT
最终输出应该是这样的。如果今天的日期是2017年7月31日
Department |Product | Date | Quantity |AgeinginDays
------------+---------+--------------------+-----------+---------
D001 |P001 | 15-Jul-2017 | 500 |16
D001 |P001 | 16-Jul-2017 | 2000 |15
D001 |P002 | 14-Jul-2017 | 1000 |17
答案 0 :(得分:0)
我创建了Inventory表并用您的示例数据填充它。 这是SQL代码。当您在将来寻求帮助时,请尝试共享此类元数据:)
create column table InventoryItems
(
Department varchar(10),
Product varchar(10),
Date date,
Quantity int,
Indicator varchar(10)
);
insert into InventoryItems select 'D001','P001','20170701',1000,'ADD' from dummy;
insert into InventoryItems select 'D001','P001','20170710',2000,'ADD' from dummy;
insert into InventoryItems select 'D001','P001','20170715',3000,'ADD' from dummy;
insert into InventoryItems select 'D001','P001','20170716',2000,'ADD' from dummy;
insert into InventoryItems select 'D001','P001','20170718',5500,'SUBTRACT' from dummy;
insert into InventoryItems select 'D001','P002','20170712',3000,'ADD' from dummy;
insert into InventoryItems select 'D001','P002','20170714',2000,'ADD' from dummy;
insert into InventoryItems select 'D001','P002','20170715',4000,'SUBTRACT' from dummy;
样本表和数据准备好后,我准备了以下SQLScript代码进行老化。由于可能很难理解并遵循代码,因此我分享了您的问题,并在Carbon提供了详细的解决方案
以下是帮助您满足要求的SQL代码
with Ins as (
select
row_number() over (partition by Product order by date) as AddId,
*,
sum(Quantity) over (partition by Product order by Date rows unbounded preceding) as sumIn,
sum(Quantity) over (partition by Product order by Date desc rows unbounded preceding) as sumX
from InventoryItems
where
Indicator = 'ADD'
), Outs as (
select
row_number() over (partition by Product order by date) as AddId,
*,
sum(Quantity) over (partition by Product order by Date rows unbounded preceding) as sumOut
from InventoryItems
where
Indicator = 'SUBTRACT'
), Inv as (
select
ins.Product, max(sumIn) - max(ifnull(sumOut,0)) as inv
from Ins
left join Outs
on ins.Product = outs.Product
group by ins.Product
), calc as (
select
Ins.*,
Inv.inv,
inv-sumx as diff
from Ins
left join Inv
on ins.Product = inv.Product
)
select
Department, Product, Date,
case when diff > 0 then quantity else quantity-abs(diff) end as Quantity,
DAYS_BETWEEN(Date,current_date) as AgeingInDays
from (
select *, 1 as rn from calc where diff >= 0
union all
(
select * from (
select
*, row_number() over (partition by Product order by diff desc) as rn
from calc
where diff < 0
) t where rn = 1
)
)
order by Product, AddId
这是上述SQL块执行的输出 stock aging SQL calculation on SAP HANA database
我希望它有所帮助,