Инструкция SQL, проверьте, имеют ли другие строки одинаковое значение

#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