получить список товаров на складе на любую дату

0

У меня есть две таблицы: один из продуктов, один из которых связан с инвентаризацией.

Таблица продуктов:

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.

  • 0
    Указывает ли каждая запись о перемещении на 1 единицу Продукта или вы пропустили поле количества?
Теги:

4 ответа

0
Лучший ответ

Возможно, я неправильно понял ваш вопрос.

Каждый раз, когда у вас есть "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.

1

Существует фундаментальная проблема, когда столбец 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 не может использоваться - если предположить, что он существует.

  • 0
    Так что, если столбец направления - это число (я полагаю, 1 для входного и для для выходного -1), как я могу получить список продуктов в наличии в любой день?
  • 0
    У меня дата и время разделены на 2 столбца: столбец даты и времени (время предназначено только для информации пользователя при сканировании продукта), поэтому нет необходимости использовать функции даты, которые я предполагаю. Я знаю только базовые SQL, но я думаю, что я понимаю, что вы имеете в виду после некоторого эксперимента, я думаю. Я очень ценю вашу помощь
0

Спасибо 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
0

Вы можете создать куб OLAP с инвентарем, транзакциями и временем в качестве измерений. Я парень MSSQL, поэтому я бы сделал все это на сервере Reporting Server, но я уверен, что там также есть анализаторы кубов MySQL.

Быстрый поиск в Google: www.ramsetcube.com

Ещё вопросы

Сообщество Overcoder
Наверх
Меню