У меня есть оператор SQL, который импортирует список продуктов из файла Access.MDB. Оператор select приведен ниже. (ну часть его)
SELECT
Brand, DESCRIPTION AS Model,
SECONDDESCRIPTION AS Description,
PRODUCT AS [Product Code], TYPE AS Batch, INACTIVE,
CORE AS [Core Range],
IIF([CUSTORD] IS NULL, ROUND(ON_HAND), (IIF(TYPE = 'DISP',ROUND(ON_HAND),ROUND(ON_HAND)-CUSTORD))) AS SOH
Вы можете заметить, что оператор select будет исключать из значений SOH все элементы, находящиеся в заказе клиента. для ясности ниже приведена строка, которая делает именно это.
IIF([CUSTORD] IS NULL, ROUND(ON_HAND), (IIF(TYPE = 'DISP',ROUND(ON_HAND),ROUND(ON_HAND)-CUSTORD))) AS SOH
Проблема, с которой я сталкиваюсь, заключается в том, что 1 код продукта может иметь несколько партий, и если количество товара в каждой партии составляет только 1, а затем столбец заказа клиента также содержит 1, это приводит к 1 - 1 = 0.
Однако столбец заказов клиентов действительно указывает, что только 1 код продукта входит в заказ клиента, а не в эту конкретную партию.
Есть ли способ проверить, был ли этот код продукта уже «выбран» и имеет ли он количество заказов клиента, и если это так, то игнорирует количество заказов клиентов для этой следующей партии в таблице?
Чтобы немного объяснить это, здесь приведена грубая идея таблицы, которая будет импортирована.
поэтому в таблице выше с моим существующим оператором выбора мои результаты будут
Яблоки 4 в партии 123456
Бананы 1 в партии 1548777
Поскольку следующие две строки яблок фактически заканчиваются значением 0 в партиях 234567 и 587554.
моя программа настроена на возврат только пользовательских значений предметов, которые они могут продать с SOH qty > 0
поэтому мне нужно, чтобы окончательные данные в моей программе выглядели так:
В моей таблице номер партии является уникальным идентификатором и не встречается в таблице дважды.
Я работаю в VB.NET, поэтому, если это невозможно сделать в операторе выбора SQL, я мог бы быть открыт для идеи настройки значений в таблице данных набора данных, однако это, вероятно, будет усложнено тем фактом, что оператор SQL Select i Я использую никогда не импортирует столбец данных CUSTORD в мою таблицу данных. Поскольку я пытался обрабатывать значения SOH непосредственно на уровне инструкции select.
Надеюсь никого не запутал и объяснил максимально просто.
Я понятия не имею, какое отношение ваш исходный код имеет к вопросу. Но позвольте мне предположить, что у вас есть таблица в формате, указанном в вопросе, и вы хотите установить on_hand
на 0
для всех продуктов, кроме первой строки. Вы можете использовать:
select product, batch_number, custord,
iif ( t.batch_number = (select top 1 t2.batch_number
from t as t2
where t2.product = t.product
order by t2.on_hand desc, t2.batch_number
),
t.on_hand, 0
) as adjusted_on_hand
from t
order by product, on_hand desc, batch_number
мне удалось заставить его работать с этим: SELECT t.product, t.batch, t.custord, t.on_hand, iif (t.batch = (SELECT top 1 t2.batch FROM INVXLS as t2 where t2.product = t.product),t.on_hand, t.on_hand - t.custord) AS newproduct FROM INVXLS as t ORDER BY t.product desc
Не
on_hand
установлен в0
, а первая строкаCUSTORD
сохранит свое значение, все остальные строкиCUSTORD
будут установлены в ноль, гдеProductcode
то же самое. Я должен быть в состоянии интерпретировать ваш пример и применить его к моему сценарию, когда я вернусь за свой стол.