#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 :
- когда пользователи выполняют транзакцию, в этой таблице отображаются сведения о каждом продукте
shipping_details.quantity
это общее количество для каждого продукта в его транзакции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 |
---- -------------------- ---------- ------------ --------- -------------
объяснение :
- эта таблица содержит информацию о том, как была отправлена информация для каждого продукта, как пример в таблице выше, столбец first_print сообщил нам, что если first_print = 1, то это первая доставка, если 0, то это не первая доставка
- из приведенной выше таблицы мы знаем, что продукт 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
), сообщает вам, что осталось. Если это больше нуля, продукт должен быть включен в результирующий набор