как подсчитать удержание количества в mysql на основе 2 таблиц

#mysql

#mysql

Вопрос:

У меня есть 2 таблицы, они называются shipping_details и shipping_resend

это таблица shipping_details

  ----- ------------- ------------ --------------- ------------- --------- 
| id  | shipping_Id |  quantity  | quantity_send |  createdAt  | product |
 ----- ------------- ------------ --------------- ------------- --------- 
|   1 |         123 |          2 | 2             | 2021-02-02  | A       |
|   2 |         123 |          1 | NULL          | 2021-02-02  | B       |
 ----- ------------- ------------ --------------- ------------- --------- 
 

Объяснение в таблице shipping_details :

  1. когда пользователи выполняют транзакцию, в этой таблице отображаются сведения о каждом продукте
  2. shipping_details.quantity это общее количество для каждого продукта в его транзакции
  3. shipping_details.quantity_send в основном это общее количество, которое было успешно отправлено пользователям, потому что иногда по какой-либо другой причине продукт не может отправить его в полном количестве, в основном, quantity_send из sum(shipping_resend .количество) в таблице shipping_resend_table для каждого продукта

это shipping_resend таблица:

  ---- -------------------- ---------- ------------ --------- ------------- 
| id | shipping_detail_id | quantity | createdAt  | product | first_print |
 ---- -------------------- ---------- ------------ --------- ------------- 
|  1 |                  1 |        1 | 2021-02-02 | A       |           1 |
|  2 |                  1 |        1 | 2021-02-03 | A       |           0 |
 ---- -------------------- ---------- ------------ --------- ------------- 
 

объяснение :

  1. эта таблица содержит информацию о том, как была отправлена информация для каждого продукта, как пример в таблице выше, столбец first_print сообщил нам, что если first_print = 1, то это первая доставка, если 0, то это не первая доставка
  2. из приведенной выше таблицы мы знаем, что продукт A был отправлен в количестве 1 в ‘2021-02-02’, а количество 1 снова в ‘2021-02-03’

Мой вопрос в том, как узнать quantity_hold, quantity_hold — это количество для каждого продукта, который не был доставлен в 2021-02-02. undelivered — это условие, при котором продукт все еще есть на нашем складе и еще не вставлен в shipping_resend таблицу

ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ должны быть такими для total_hold в ‘2021-02-02’:

  --------- ------------ 
| product | total_hold |
 --------- ------------ 
| A       |          1 |
| B       |          1 |
 --------- ------------ 
 

я пробовал с этим

 SELECT sd.product,
IF(sd.quantity != IFNULL(sd.quantity_send,0), (sd.quantity - IFNULL(sd.quantity_send,0)), NULL) AS total_hold

FROM 

shipping_details sd 
LEFT JOIN shipping_resend sr
ON sd.id = sp.shipping_detail_id
WHERE COALESCE((sr.createdAt BETWEEN '2021-02-02' AND '2021-02-03'),
           (sd.createdAt BETWEEN '2021-02-02' AND '2021-02-03'))

GROUP BY sd.product;
 

Комментарии:

1. Поделитесь с нами запросом, который вы пробовали до сих пор

Ответ №1:

Вам нужно суммировать общее количество отправленных каждого продукта и сравнить его с общим количеством, которое необходимо отправить.

 SELECT shipping_details.product
  ,shipping_details.quantity - COALESCE(total_shipped, 0) as total_hold
FROM shipping_details LEFT JOIN
  (SELECT product, SUM(quantity) as total_shipped
   FROM shipping_resend
   GROUP BY product) AS shipped
ON shipping_details.product = shipped.product
WHERE shipping_details.quantity - COALESCE(total_shipped, 0) > 0
 

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

Я не уверен, что ваш пример вывода корректен, учитывая цифры в ваших таблицах. Мой запрос возвращает продукт только B как имеющий запас, поскольку общее количество shipping_resend.quantity для продукта A равно 2.

Вывод

продукт total_hold
B 1

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

 SELECT shipping_details.product
  ,shipping_details.quantity - COALESCE(total_shipped, 0) as total_hold
FROM shipping_details LEFT JOIN
  (SELECT product, SUM(quantity) as total_shipped
   FROM shipping_resend
   WHERE createdAt = '2021-02-02'
   GROUP BY product) AS shipped
ON shipping_details.product = shipped.product
WHERE shipping_details.quantity - COALESCE(total_shipped, 0) > 0
 

Вывод

продукт total_hold
A 1
B 1

Комментарии:

1. A должно быть quantity_hold 1, потому что другой 1, основанный на shipping_resend, просто отправляется на ‘2021-02-03’ вместо того, что я хочу выяснить, находится на ‘2021-02-02’, так что, по сути, другой 1 все еще находится в режиме ожидания, потому что оставшиеся запасы отправляются на ‘2021-02-03’

2. пожалуйста, взгляните, я хочу узнать total_hold на дату ‘2021-02-02’, то есть всего 1 должен быть отправлен на продукт A в этот день, поэтому должно быть еще 1, оставшееся total_hold, потому что доставка будет выполнена на следующий день

3. Итак, вы хотите отфильтровать запрос за определенный день? В этом случае добавьте WHERE предложение во внутренний запрос.

4. извините, я новичок в MySQL, что произойдет, если я не введу WHERE shipping_details.quantity - COALESCE(total_shipped, 0) > 0

5. Вы спрашиваете, требуется ли предложение where? Вычитание отгруженной суммы ( SUM(shipping_resend.quantity ) из суммы, подлежащей отгрузке ( shipping_details.quantity ), сообщает вам, что осталось. Если это больше нуля, продукт должен быть включен в результирующий набор