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

У меня есть оператор 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 код продукта входит в заказ клиента, а не в эту конкретную партию.

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

Чтобы немного объяснить это, здесь приведена грубая идея таблицы, которая будет импортирована.

Продукт Серийный номер ON_HAND ПОПЕЧИТЕЛЬ яблоки 123456 5 1 яблоки 234567 1 1 яблоки 587554 1 1 Бананы 1548777 1 0

поэтому в таблице выше с моим существующим оператором выбора мои результаты будут

Яблоки 4 в партии 123456

Бананы 1 в партии 1548777

Поскольку следующие две строки яблок фактически заканчиваются значением 0 в партиях 234567 и 587554.

моя программа настроена на возврат только пользовательских значений предметов, которые они могут продать с SOH qty > 0

поэтому мне нужно, чтобы окончательные данные в моей программе выглядели так:

Продукт Серийный номер ON_HAND ПОПЕЧИТЕЛЬ яблоки 123456 5 1 яблоки 234567 1 0 яблоки 587554 1 0 Бананы 1548777 1 0

В моей таблице номер партии является уникальным идентификатором и не встречается в таблице дважды.

Я работаю в VB.NET, поэтому, если это невозможно сделать в операторе выбора SQL, я мог бы быть открыт для идеи настройки значений в таблице данных набора данных, однако это, вероятно, будет усложнено тем фактом, что оператор SQL Select i Я использую никогда не импортирует столбец данных CUSTORD в мою таблицу данных. Поскольку я пытался обрабатывать значения SOH непосредственно на уровне инструкции select.

Надеюсь никого не запутал и объяснил максимально просто.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
187
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Не on_hand установлен в 0, а первая строка CUSTORD сохранит свое значение, все остальные строки CUSTORD будут установлены в ноль, где Productcode то же самое. Я должен быть в состоянии интерпретировать ваш пример и применить его к моему сценарию, когда я вернусь за свой стол.

Andy Andromeda 13.12.2020 21:27

мне удалось заставить его работать с этим: 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

Andy Andromeda 14.12.2020 13:40

Другие вопросы по теме