У меня есть две таблицы: один из продуктов, один из которых связан с инвентаризацией.
Таблица продуктов:
Seq | Name | Barcode
Переместить таблицу:
Seq | ProductFK | Direction | Date
Каждый продукт может иметь несколько записей перемещения IN и/или OUT.
Как я могу получить список всего продукта, который находится на складе в любую дату?
Я пробовал следующее, но это не работает, если движется несколько ходов IN и OUT:
SELECT DISTINCT Product.* , Move.* FROM Product LEFT JOIN Move ON Product.Seq=Move.StockFK where not exists ( select * from Move where Product.Seq=Move.StockFK and Direction = "OUT")
Может ли кто-нибудь помочь мне в этом, пожалуйста. Я использую MySQL 5.1.
Возможно, я неправильно понял ваш вопрос.
Каждый раз, когда у вас есть "IN", просто добавляйте количество акций на единицу. Каждый раз, когда есть "OUT", просто вычитайте его на единицу. Разница заключается в запасе?
SELECT ProductFK, SUM(IF(m.direction='IN'))-SUM(IF(m.direction='OUT')) AS stock
FROM Move m WHERE m.Date < '20090101' AND stock > 0
Чтобы это сделать, теперь просто присоедините его к таблице продуктов, если хотите.
Если у вас есть поле количества, которое вы опустили, просто измените IF IF SUM.
Существует фундаментальная проблема, когда столбец direction
является text/varchar, содержащий только значения "in" и/или "out". Там нет способа узнать, какие цифры задействованы, что означает отсутствие возможности узнать, существует ли запас в определенный день. Если тип данных был числом, вы могли бы суммировать (при условии, что исходящий запас отрицателен) столбцы для заданной даты.
Предполагая, что столбец направления использует числовой тип данных, используйте:
SELECT p.seq,
p.name,
p.barcode,
x.stock_onhand
FROM PRODUCTS p
JOIN (SELECT m.productfk,
SUM(m.direction) 'stock_onhand'
FROM MOVE m
WHERE DAY(m.date) = ?
AND MONTH(m.date) = ?
AND YEAR(m.date) = ?
GROUP BY m.productfk,
DAY(m.date),
MONTH(m.date),
YEAR(m.date)) x ON x.productfk = p.seq
Поскольку типы данных DATETIME и TIMESTAMP включают временную часть, вам необходимо использовать функции для изоляции даты. Из-за использования функции в столбце индекс в столбце date
не может использоваться - если предположить, что он существует.
Спасибо OMG Ponies и eckesicle: я обнаружил, что сочетание ваших ответов предоставило мне рабочее решение:
SELECT p.Seq,
p.Barcode,
x.stock_onhand
FROM Product p
JOIN (SELECT ProductFK, SUM(IF(m.Direction='IN',1,0))-SUM(IF(m.Direction='OUT',1,0)) 'stock_onhand'
FROM Move m WHERE m.Date < "2010/01/19" GROUP BY ProductFK )
x ON x.ProductFK = p.Seq where stock_onhand>0
Вы можете создать куб OLAP с инвентарем, транзакциями и временем в качестве измерений. Я парень MSSQL, поэтому я бы сделал все это на сервере Reporting Server, но я уверен, что там также есть анализаторы кубов MySQL.
Быстрый поиск в Google: www.ramsetcube.com