Представление "Расчет устаревания инвентаря" в Hana Studio

Я хочу сделать расчетное представление в hana studio, где мне нужно поддерживать старение продукта, ожидающего в инвентаре.

Он будет вычитаться по принципу «первым пришел - первым» ... Я имею в виду, что в случае продукта 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

И конечный результат должен быть примерно таким. если сегодня 31 июля 2017 г.

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

person Arun Gupta    schedule 09.08.2017    source источник
comment
кто-нибудь?? пожалуйста помоги   -  person Arun Gupta    schedule 10.08.2017


Ответы (1)


Я создал инвентарную таблицу и заполнил ее вашими образцами данных. Вот коды 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 для устаревания. Поскольку может быть сложно понять код и следовать ему, я поделился вашей проблемой и предоставил подробное решение по адресу SQL-расчет устаревания запасов в базе данных SAP HANA

И вот коды 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  введите описание изображения здесь

Я надеюсь, что это помогает,

person Eralper    schedule 28.11.2017