Hana Studio中的库存老化计算视图

时间:2017-08-09 06:05:20

标签: hana hana-sql-script hana-studio

我想在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

1 个答案:

答案 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

我希望它有所帮助,