Я создаю систему отслеживания проката оборудования, которая управляет запасами, выделяемыми для каждой работы, этот запас также присваивается ящикам.
У меня есть следующие таблицы:
Таблицы (список контейнеров, назначенных заданию на стадии выполнения, задание пустым при возврате)
box
job
...
Таблица кодов (виды инвентаря)
code
dept
type
description
...
Таблица заданий (jobs)
job
client
name
...
Стол заказов (заказов, связанных с работой)
id
job
...
Элементы таблицы заказов (элементы, относящиеся к заказу)
id
order
code
quantity
...
Таблица выполняет (выполнение заказа, применить + количество на судне, - количество при возврате)
id
orderitem
code
quantity
...
Таблица запасов (+ количество на покупку, - количество на утилизацию)
id
code
quantity
...
Таблица Stockbox (применить + или - количество кода для коробки)
id
code
box
quantity
...
Я сгенерировал результирующий набор, который показывает все выполненные задания, когда SUM (количество)> 0 (игнорировать возвращенные элементы):
SELECT
'' AS box,
codes.code AS item,
'' AS parent,
codes.code AS code,
codes.dept AS codedept,
codes.type AS codestype,
codes.description AS codedesc,
'' AS make,
'' AS model,
'' AS name,
'' AS serial,
'' AS status,
'' AS LOCATION,
orders.job AS job,
SUM(fulfils.quantity) AS quantity
FROM
fulfils
LEFT JOIN orderitems ON orderitems.id = fulfils.orderitem
LEFT JOIN orders ON orders.id = orderitems.order
LEFT JOIN codes ON codes.code = fulfils.code
WHERE
orders.job = 'TEST'
GROUP BY
fulfils.code,
codes.dept,
codes.type,
codes.description,
orders.job
HAVING
quantity > 0;
Это работает как ожидалось.
Теперь моя задача состоит в том, чтобы разделить это на блоки на основе их распределения по заданию и их общего распределения на складе (сумма сумм на складе для этого блока и кода). Также мне нужно включить итоговую сумму, не выделенную ни для одного ящика (СУММА количества - СУММА количества, назначенного на ящик). Я игнорирую биржевую таблицу для этой цели как неактуальную, только биржа.
Предполагается, что поле 'BOX01' назначено для задания 'TEST', для 'BOX01' сумма SUM равна 3. Задание 'TEST', код 'PRODUCT01' с помощью таблицы выполняет, имеет сумму 5, я смотрю эти результаты при выполнении запроса для .job = 'TEST'.
+-------+-----------+-----+----------+
| box | item | ... | quantity |
+-------+-----------+-----+----------+
| BOX01 | PRODUCT01 | ... | 3 |
| | PRODUCT01 | ... | 2 |
+-------+-----------+-----+----------+
Я полностью открыт для изменений в дизайне. Простой обходной путь - добавить «коробку» к выполнению, но я бы хотел, чтобы у вас была свобода перераспределять запас между ящиками после того, как запас был выполнен, не затрагивая таблицу выполнения.
Большое спасибо заранее.
Обновление:
Это делает меня где-то рядом, создавая строки для каждого ящика, который выделен для работы и запаса в ней. Теперь мне нужно вычесть сумму в штучной упаковке из оставшегося количества выполнения.
SELECT
stockbox.box AS box,
codes.code AS item,
stockbox.box AS parent,
codes.code AS code,
codes.dept AS codedept,
codes.type AS codestype,
codes.description AS codedesc,
'' AS make,
'' AS model,
'' AS name,
'' AS serial,
'' AS status,
'' AS location,
boxes.job AS job,
SUM(stockbox.quantity) AS quantity
FROM
stockbox
LEFT JOIN codes ON codes.code = stockbox.code
LEFT JOIN boxes ON boxes.box = stockbox.box
WHERE
boxes.job = 'TEST'
GROUP BY
stockbox.box,
codes.code,
codes.dept,
codes.type,
codes.description,
boxes.box
HAVING
quantity > 0
UNION
SELECT
'' AS box,
codes.code AS item,
'' AS parent,
codes.code AS code,
codes.dept AS codedept,
codes.type AS codestype,
codes.description AS codedesc,
'' AS make,
'' AS model,
'' AS name,
'' AS serial,
'' AS status,
'' AS location,
orders.job AS job,
SUM(fulfils.quantity) AS quantity
FROM
fulfils
LEFT JOIN orderitems ON orderitems.id = fulfils.orderitem
LEFT JOIN orders ON orders.id = orderitems.order
LEFT JOIN codes ON codes.code = fulfils.code
WHERE
orders.job = 'TEST'
GROUP BY
fulfils.code,
codes.dept,
codes.type,
codes.description,
orders.job
HAVING
quantity > 0;
Дает (оставшиеся 5 должны быть 2):
+-------+-----------+-----+----------+
| box | item | ... | quantity |
+-------+-----------+-----+----------+
| BOX01 | PRODUCT01 | ... | 3 |
| | PRODUCT01 | ... | 5 |
+-------+-----------+-----+----------+