2016-08-30 2 views
0

Мне нужно получить данные о продажах из открытых ордеров, отсортированных по коду. Элементы разделены в таблице запасов по номеру лота (по причинам прослеживаемости), но номера партий не отображаются в таблице заказов. Единственная ссылка между двумя таблицами - это номер детали.Ненужные результаты запроса

Когда мой запрос

ВЫБРАТЬ код, SUM (кол-во * цена) AS Sales из заказов INNER JOIN товара на складе orders.partno = stock.partno GROUP BY код

начали возвращаться странные результаты (очень высокие показатели продаж для данного кода), я изменил его на

ВЫБРАТЬ DISITNCT orders.partno, stock.lot, stock.code из заказов INNER JOIN запас ON orders.partno = stock.partno

и заметил, что если несколько партий данной части есть в наличии все они вернулись

Part1 LOTA код

Part1 LotB код

Part1 LotC код

, что означает, что если клиент заказывает 300 единиц части 1, мой запрос возвращает 900, а мой показатель продаж умножается на 3.

Как я могу обойти это?

Следует отметить, что я не работаю из базы данных, а из группы таблиц, структуры которых иногда могут быть причудливыми.

+1

К сожалению, с таким дизайном вы не можете группировать свои продажи по коду. –

ответ

0

Вы должны действительно использовать ссылку table.column или alias.column при написании запросов. Поскольку ваш вопрос стоит, мы не знаем, из какой таблицы стоит ЦЕНА ... таблица деталей или таблица лотов. Если вы имеете дело с отслеживанием запасов, например, методом учета FIFO или LIFO, у вас должна быть ассоциация с таблицей лотов для отслеживания/продажи запасов.

Теперь, почему вы получаете большие цифры? Это связано с декартовым результатом. Если вы не знакомы с этим, для каждой записи в одной таблице, соединенной с другой, она возвращает много совпадений.

Итак, если у вас есть заказ одной позиции, в таблице доступных продуктов есть только одна позиция. Так что это просто соотношение 1: 1. Теперь у вас есть таблица STOCK, которая может иметь несколько записей для одного и того же номера детали. Теперь вы возвращаете ту же самую первоначальную позицию заказа для EACH LOT ENTRY в таблице запасов. Итак, теперь для вашего 1 предмета вы получаете 3 лота (результат 1: 3).

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

Если, однако, у вас есть общая таблица продуктов всего, что вы продаете, и эта таблица имеет общую общую цену, независимо от того, какая «партия» была использована для продажи, я бы присоединился к этой таблице вместо вашего отчета. Но у вас по-прежнему будет учетная запись инвентаризации, стоимости товара и т. Д.