Справка по ошибке оператора IIF Microsoft Access — Несколько операторов IIF в одном запросе

#sql #ms-access #iif

Вопрос:

надеюсь, кто-нибудь сможет мне помочь.

Я пытаюсь выполнить этот запрос, но получаю следующую ошибку. Мне нужно построить логику, основанную на разных полях в разных таблицах, а затем записать эти данные в новое поле таблицы. Это только начало моего запроса, но я уже получаю сообщение об ошибке :/

Логика, которую я пытаюсь изложить, такова

если размер контейнера = ’20’ и скорость загрузки PLX < 20 м, затем используйте скорость загрузки PLX, в противном случае используйте скорость загрузки 20 м, если Размер контейнера = ’40’ и скорость загрузки PLX < 40 м, затем используйте скорость загрузки PLX, в противном случае используйте скорость загрузки 40 м, если размер контейнера = ‘LCL’ и скорость загрузки PLX < LCLMRate, используйте скорость загрузки PLX, в противном случае LCLMRate

Вот запрос, который я написал, но у меня что-то не так с синтаксисом. Любая помощь будет признательна. 🙂

 Select IIF ([Shipments]![ContainerSize] = '20') ,
(IIF (([CustomerRates]![CBMRate] * [Shipments]![PLX]) < [CustomerRates]![20MRate]) , ([CustomerRates]![CBMRate] * [Shipments]![PLX]) , ([CustomerRates]![20MRate])) , (IIF 
([Shipments]![ContainerSize] = '40') ,
(IIF ([CustomerRates]![CBMRate] * [Shipments]![PLX]) < [CustomerRates]![40MRate]), ([CustomerRates]![CBMRate] * [Shipments]![PLX]) , ([CustomerRates]![40MRate])),
(IIF  ([CustomerRates]![CBMRate] * [Shipments]![PLX]) < [CustomerRates]![LCLMRate]), ([CustomerRates]![CBMRate] * [Shipments]![PLX]) , ([CustomerRates]![LCLMRate]))
From [CustomerRates] , [Shipments]
Where
[shipments]![customerid]=[customerRates]![customerid]
 

Комментарии:

1. Я думаю, что здесь слишком много скобок. Например, в первой строке перед запятой IIF оператор закрывается. И я думаю, что аналогичная проблема существует и с другими IIF s.

2. Вам следует просто удалить все лишние скобки. Там должно быть по одному в начале и по одному в конце каждого IFF , вот так IIF(condition, IIF(condition, true, false), IIF(condition, IIF(condition, true, false), IIF(condition, true, false)))

Ответ №1:

Считать:

 IIf([ContainerSize] = 20, IIf([CBMRate] * [PLX] < [20MRate], [CBMRate] * [PLX], [20MRate]), 
    IIf([ContainerSize] = 40, IIf([CBMRate] * [PLX] < [40MRate], [CBMRate] * [PLX], [40MRate]),
        IIf([CBMRate] * [PLX] < [LCLMRate]), [CBMRate] * [PLX], [LCLMRate])))

 

Или

 Switch([ContainerSize] = 20, IIf([CBMRate] * [PLX] < [20MRate], [CBMRate] * [PLX], [20MRate]),
       [ContainerSize] = 40, IIf([CBMRate] * [PLX] < [40MRate], [CBMRate] * [PLX], [40MRate]),
       True, IIf([CBMRate] * [PLX] < [LCLMRate]), [CBMRate] * [PLX], [LCLMRate]))