2017-08-09 62 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

我希望它能幫助,