Mysql FIFO потребление - PullRequest
0 голосов
/ 13 мая 2019

у меня 2 таблицы article_receive , которая записывает получение через следующие столбцы;

item   | title     |trans_id |qty|price|current_items | current_value
ADN231 | 12" Valve |jvn2333  |24 | 175 | 24           | 4200
ADN231 | 12" Valve |jvn2388  |12 | 185 | 36           | 6420

Текущие предметы - это всегда сумма всех предметов

Текущее значение - это стоимость всех транзакций вместе взятых (4200 + 2220)

Для выдачи у меня есть article_issue со следующими столбцами;

item   | title     | trans_id | qty 
ADN231 | 12" Valve | ISU2333  | 6
ADN231 | 12" Valve | ISU2401  | 24

Мое требование заключается в том, что я хочу создать отчет о потреблении, который в основном рассчитывает точное количество позиций по каждому выпуску, используя метод FIFO.

2-я строка в article_issue содержит элементы из 2 транзакций и имеет 2 разные цены. Как рассчитать его в MYSQL 8.0.15 Community Version .

В настоящее время я использую этот оператор SQL;

SELECT 
article_receives.id as RCVID, article_receives.item_id, article_receives.item_title, article_receives.quantity as rcv_qty,article_receives.transaction_id, article_receives.price as rate,
article_issues.id as ISUID,article_issues.quantity as isu_qty, article_issues.quantity * article_receives.price as value
FROM article_receives
LEFT JOIN article_issues ON article_receives.item_id = article_issues.item_id
ORDER BY article_receives.item_id
/** Some Column names are changed */

Это дает мне данные в следующем состоянии; enter image description here Пожалуйста, помогите мне в создании правильного отчета о потреблении в MySQL. Кстати, это приложение, разработанное в laravel 5.8, так что eloquent также доступен. Спасибо

1 Ответ

0 голосов
/ 14 июля 2019

Благодаря P.Salmon предоставил ссылку FIFO Я смог решить проблему.

MySql Query is:

WITH 
  running_purchase AS
  ( SELECT transaction_id, created_at, quantity, item_id, price,
           SUM(quantity) OVER (PARTITION BY item_id
                               ORDER BY created_at, transaction_id
                               ROWS BETWEEN UNBOUNDED PRECEDING
                                        AND CURRENT ROW)
             AS running_total
    FROM article_receives
  ),
  running_stock AS
  ( SELECT demand_id, created_at, quantity, item_id, 
           SUM(quantity) OVER (PARTITION BY item_id
                               ORDER BY created_at, demand_id
                               ROWS BETWEEN UNBOUNDED PRECEDING
                                        AND CURRENT ROW)
             AS running_total
    FROM article_issues
  )
SELECT 
    s.demand_id, p.transaction_id,p.created_at as purchase_date, p.item_id, p.price, s.created_at as issue_date,
    LEAST(p.running_total, s.running_total) 
    - GREATEST(s.running_total - s.quantity, p.running_total - p.quantity)
        AS quantity
FROM running_purchase AS p
  JOIN running_stock AS s
    ON  p.item_id = s.item_id
    AND s.running_total - s.quantity < p.running_total  
    AND p.running_total - p.quantity < s.running_total 
WHERE s.created_at BETWEEN '2019-06-01' AND DATE_ADD('2019-06-30', INTERVAL 1 DAY)
ORDER BY
    p.item_id, p.created_at, p.transaction_id ;
...