#sql #vb.net #ms-access #select #datatable
#sql #vb.net #ms-access #выберите #datatable
Вопрос:
У меня есть инструкция 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 из кодов продукта в заказе клиента, а не в этой конкретной партии.
Есть ли способ проверить, был ли этот код продукта уже «выбран» и имеет ли он количество заказов клиентов против него, и если это так, то игнорируйте количество заказов клиентов против этой следующей партии в таблице?
Чтобы немного объяснить это, приведу примерное представление о таблице, которая будет импортирована.
Продукт | Batch_Number | ON_HAND | CUSTORD |
---|---|---|---|
Яблоки | 123456 | 5 | 1 |
Яблоки | 234567 | 1 | 1 |
Яблоки | 587554 | 1 | 1 |
Бананы | 1548777 | 1 | 0 |
итак, в приведенной выше таблице с моим существующим оператором select мои результаты будут
Яблоки 4 в пакете 123456
Бананы 1 в пакете 1548777
Поскольку следующие две строки яблок фактически будут иметь значение 0 в пакетах 234567 и 587554
моя программа настроена на возврат только к пользовательским значениям товаров, которые они могут продать с количеством SOH> 0
поэтому мне нужно, чтобы конечная таблица данных в моей программе выглядела так:
Продукт | Batch_Number | ON_HAND | CUSTORD |
---|---|---|---|
Яблоки | 123456 | 5 | 1 |
Яблоки | 234567 | 1 | 0 |
Яблоки | 587554 | 1 | 0 |
Бананы | 1548777 | 1 | 0 |
В моей таблице номер партии является уникальным идентификатором и не встречается дважды в таблице.
Я работаю в VB.NET так что, если это невозможно сделать в инструкции SQL select, я мог бы быть открыт для идеи корректировки значений в dataset datatable, однако это, вероятно, усложнилось бы тем фактом, что оператор SQL Select, который я использую, фактически никогда не импортирует столбец CUSTORD данных в мойdatatable. Поскольку я пытался обрабатывать значения SOH непосредственно на уровне оператора select.
Надеюсь, я никого не запутал и объяснил это как можно проще.
Ответ №1:
Я понятия не имею, какое отношение ваш исходный код имеет к вопросу. Но позвольте мне предположить, что у вас есть таблица в формате, указанном в вопросе, и вы хотите установить 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
Комментарии:
1. Не
on_hand
установлено0
значение, скорее первая строкаCUSTORD
сохранит свое значение, все остальные строкиCUSTORD
будут равны нулю, гдеProductcode
то же самое. Я должен быть в состоянии интерпретировать ваш пример и применить его к своему сценарию, когда вернусь за свой стол.2. мне удалось заставить его работать с помощью этого:
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