2017-08-09 61 views
0

我想在hana工作室中进行计算视图,在那里我必须维护库存中待处理产品的老化。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

我创建了库存表并使用您的示例数据填充它。 这是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代码。因为它也许很难理解和遵循的代码,我分享你的问题,并在stock aging SQL calculation on SAP HANA database

提供了详细的解决方案,这里是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块执行 enter image description here

我希望它能帮助,