Условное объединение нескольких таблиц с исключенными элементами - PullRequest
0 голосов
/ 27 марта 2019

Я создаю систему отслеживания проката оборудования, которая управляет запасами, выделяемыми для каждой работы, этот запас также присваивается ящикам.

У меня есть следующие таблицы:

Таблицы (список контейнеров, назначенных заданию на стадии выполнения, задание пустым при возврате)

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 |
+-------+-----------+-----+----------+

1 Ответ

0 голосов
/ 27 марта 2019

Думаю, я это взломал:

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) - (
        SELECT SUM(moo.quantity)
        FROM (
            SELECT
                stockbox.quantity AS quantity
            FROM
            stockbox
            LEFT JOIN boxes boxes2 ON boxes2.box = stockbox.box
            WHERE
                boxes2.job = 'TEST'
            ) AS moo
        ) 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;

Кажется, что он достиг того, что мне нужно, и дал мне лучшее понимание суммирования вложенных выборок.

Любые другие решения с благодарностью.

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