sql запрос на поиск открытых - PullRequest
0 голосов
/ 19 апреля 2020

Учитывая этот набор данных:

     Date      |  Itemcode  | Rec or Out | DocType  |  Qty     |
    -----------+------------+-----------------------+----------+
    01/01/2020 |  100011    | Rec        | GRN      | 100      |
    01/01/2020 |  100011    | Out        | FA       |  50      |
    01/01/2020 |  100011    | Out        | FA       |  10      |
    02/02/2020 |  100011    | Out        | FA       |  30      |
    02/02/2020 |  100011    | REC        | GRN      | 100      |

Мне нужен результат, день 2-й начальный запас и движение и закрытый запас '

OpeningStock = day 1st (all rec- all out)' 
FA           = day 2nd (all out)' 
GRN          = day 2nd (all rec)'
ClosingStock=  openingstock+GRN-Fa


 Itemcode | OpeningStock | FA | GRN | ClosingStock |
 ---------+--------------+----+-----+--------------+
 100011   |     40       | 30 | 100 | 110          |

Ответы [ 3 ]

0 голосов
/ 19 апреля 2020

Вы можете использовать функцию окна:

select itemcode, rec_qty - Out_qty as OpeningStock, FA, GRN, 
       ((rec_qty - Out_qty) + GRN - FA) as ClosingStock
from(select itemcode, 
            sum(case when seq = 1 and rec = 'rec' then qty end) as rec_qty,
            sum(case when seq = 1 and rec = 'Out' then qty end) as Out_qty,
            sum(case when seq = 2 and rec = 'Out' then qty end) as FA,
            sum(case when seq = 2 and rec = 'rec' then qty end) as grn
     from(select t.*, dense_rank() over (partition by itemcode order by date) as seq
          from table t
         ) t
     group by itemcode
    ) t;
0 голосов
/ 19 апреля 2020

Вы просто хотите накопительную сумму, которая предоставляется с помощью оконных функций. Вы можете получить значения для всех дней, используя:

select date, itemcode,
       sum(sum(case when rec = 'Rec' then qty else - qty end)) over
           (partition by itemcode
            order by date
            rows between unbounded preceding and 1 preceding
           ) as openingstock
       sum(case when doctype = 'FA' then qty end) as fa,
       sum(case when doctype = 'GRN' then qty end) as grn,
       sum(sum(case when rec = 'Rec' then qty else - qty end)) over
           (partition by itemcode order by date) as closingstock
from t
group by date, itemcode;

Если вы хотите выбрать конкретную дату, вы можете использовать ее как подзапрос.

0 голосов
/ 19 апреля 2020

Попробуйте следующие логи c -

ДЕМО ЗДЕСЬ

WITH CTE
AS(
    SELECT Itemcode,MIN(Date) MD, 
    (
        SELECT SUM(CASE WHEN DocType = 'GRN' THEN Qty ELSE Qty*-1 END) 
        FROM your_table 
        WHERE Itemcode = A.Itemcode
        AND Date = MIN(A.Date)
    ) OS
    FROM your_table A
    GROUP BY Itemcode
)

SELECT B.Itemcode,
MAX(A.OS) OpeningStock ,
SUM(CASE WHEN DocType = 'FA' THEN Qty ELSE 0 END) FA,
SUM(CASE WHEN DocType = 'GRN' THEN Qty ELSE 0 END) GRN,
MAX(A.OS) +
    SUM(CASE WHEN DocType = 'GRN' THEN Qty ELSE 0 END) -
    SUM(CASE WHEN DocType = 'FA' THEN Qty ELSE 0 END)
AS ClosingStock 
FROM CTE A
INNER JOIN your_table B
ON A.MD < B.Date AND A.Itemcode = B.Itemcode
GROUP BY B.Itemcode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...