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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д