JOIN результатов двух подзапросов с таблицей в основном запросе - MySQL
Формулировка задачи:
Есть такие таблицы:
• товар: товар_id, наименование_товара
• ЦН: ЦН_id (primary), дата_сдачи
• СЦН: ЦН_id, товар_id, количество
• ТТН: ТТН_id (primary), дата_отправки
• СТТН: ТТН_id, товар_id, количество
Тут ПП (платёжные поручения) указывают отправленый заказчику товар. ЦН (цеховые накладные) — товар произведённый.
Надо получить остатки товара на заданную дату, т.е. таблицу
наименование_товара | остаток_на_складе
В первом подзапросе я получал
товар_id | всего_сдано
Во втором
товар_id | всего_отправлено
В главном запросе пытался сделать так:
Но SQL ругается на конструкцию JOIN'ов между подзапросами.
Так как объединить результаты подзапросов в главном запросе?
Или может есть способ сделать всё иначе/проще?
SELECT наименование_товара, (всего_сдано) - (всего_отправлено) AS остаток_на_складе
FROM товар JOIN
(
(--первый подзапрос
SELECT СЦН.товар_id, SUM(СЦН.количество) AS всего_сдано
FROM СЦН JOIN ЦН ON СЦН.ЦН_id = ЦН.ЦН_id
WHERE ЦН.дата_сдачи<=CURDATE() GROUP BY СЦН.товар_id
)
JOIN
(--второй подзапрос
SELECT СТТН.товар_id, SUM(СТТН.количество) AS всего_отправлено
FROM СТТН JOIN ТТН ON СТТН.ТТН_id = ТТН.ТТН_id
WHERE ТТН.дата_отправки<=CURDATE() GROUP BY СТТН.товар_id
)
ON СЦН.товар_id = ТТН.товар_id
)
ON товар.товар_id = СЦН.товар_id
HAVING остаток_на_складе>0Решение задачи: «JOIN результатов двух подзапросов с таблицей в основном запросе»
textual
Листинг программы
SELECT product.product_name, (ifnull(SUM(scn.quantity),0) - ifnull(SUM(sttn.quantity),0)) AS have FROM product LEFT JOIN ( (scn JOIN cn ON scn.CN_id=cn.CN_id) LEFT JOIN (sttn JOIN ttn ON sttn.TTN_id=ttn.TTN_id) ON scn.product_id = sttn.product_id ) ON product.product_id = scn.product_id GROUP BY product.product_name HAVING have>0