SQL Server использует вычисляемый столбец IIF, избегая "Вложенные выражения могут быть вложены только до уровня 10" - PullRequest
0 голосов
/ 04 декабря 2018

Ниже приведены данные, которые у меня есть

Пример таблицы

WH_QTY - это общее количество, доступное, VIP, A, B, C - приоритет.например, продукт должен быть сначала выделен VIP FIRST, а затем A, B, C.

Используя операторы case, я смог получить правильные значения для VIP_Avail, A_Avail, но переходя к B_Avail, я получил следующую ошибку.«Выражения регистра могут быть вложены только до уровня 10»

Все, что мне нужно, - это использовать вычисленный столбец VIP_Avail в качестве основы для моих расчетов A_Avail и так далее.Но так как я ссылаюсь на все заявления по делу, это не так.

Ниже приведен запрос для VIP_Avail

IIF(ORDER_ITEMS.WH_OH =0,0,IIF(ORDER_ITEMS.WH_OH>=ORDER_AVAILABLE.VIP,ORDER_AVAILABLE.VIP,IIF(ORDER_ITEMS.WH_OH<ORDER_AVAILABLE.VIP,ORDER_ITEMS.WH_OH,0))) AS VIP_AVAIL

, а ниже - запрос для A_Avail

CASE
WHEN
ORDER_ITEMS.WH_OH = 0 THEN 0


-- WHEN (WH_QTY-VIP)<A AND WH> 0 THEN (WH-VIP)
WHEN
((ORDER_ITEMS.WH_OH-IIF(ORDER_ITEMS.WH_OH =0,0,IIF(ORDER_ITEMS.WH_OH>=ORDER_AVAILABLE.VIP,ORDER_AVAILABLE.VIP,IIF(ORDER_ITEMS.WH_OH<ORDER_AVAILABLE.VIP,ORDER_ITEMS.WH_OH,0))))<A AND ORDER_ITEMS.WH_OH>0) THEN (ORDER_ITEMS.WH_OH-IIF(ORDER_ITEMS.WH_OH =0,0,IIF(ORDER_ITEMS.WH_OH>=ORDER_AVAILABLE.VIP,ORDER_AVAILABLE.VIP,IIF(ORDER_ITEMS.WH_OH<ORDER_AVAILABLE.VIP,ORDER_ITEMS.WH_OH,0))))
-- WHEN (WH_QTY - VIP) >= A THEN A
WHEN
(ORDER_ITEMS.WH_OH-IIF(ORDER_ITEMS.WH_OH =0,0,IIF(ORDER_ITEMS.WH_OH>=ORDER_AVAILABLE.VIP,ORDER_AVAILABLE.VIP,IIF(ORDER_ITEMS.WH_OH<ORDER_AVAILABLE.VIP,ORDER_ITEMS.WH_OH,0))))>=ORDER_AVAILABLE.A THEN ORDER_AVAILABLE.A
END AS A_AVAIL

Спасибо, Чен

1 Ответ

0 голосов
/ 04 декабря 2018

Если вы хотите обновить таблицу, я бы сделал что-то вроде этого:

UPDATE tickets_available
SET VIP_AVAIL = IIF(WH_OH > VIP, VIP, WH_OH),
    A_AVAIL = IIF(WH_OH - VIP > A, A , if (WH_OH - VIP >= 0, WH_OH - VIP, 0)),
    B_AVAIL = IIF(WH_OH - VIP - A > B, B, if (WH_OH - VIP - A >= 0, WH_OH - VIP - A, 0)),
    C_AVAIL = IIF(WH_OH - VIP - A - B > C, C, if (WH_OH - VIP - A - B >= 0, WH_OH - VIP - A - B, 0))

UPDATE tickets_available
SET VIP_AVAIL = CASE WHEN WH_OH > VIP THEN VIP ELSE WH_OH END,
    A_AVAIL = CASE WHEN WH_OH - VIP > A THEN A ELSE 
        CASE WHEN WH_OH - VIP >= 0 THEN WH_OH - VIP ELSE 0 END 
    END,
    B_AVAIL = CASE WHEN WH_OH - VIP - A > B THEN B ELSE
        CASE WHEN WH_OH - VIP - A >= 0 THEN  WH_OH - VIP - A ELSE 0 END 
    END,
    C_AVAIL = CASE WHEN WH_OH - VIP - A - B > C THEN C ELSE
        CASE WHEN WH_OH - VIP - A - B >= 0 THEN WH_OH - VIP - A - B ELSE 0 END
    END

Я использовал и IIF, и CASE, чтобы вы могли выбрать тот, который вы хотели бы использовать.Предпочтительно вы используете IIF конечно, он гораздо более читабелен.

Редактировать: добавлен выбор по запросу.

SELECT
    Item,
    WH_OH,
    VIP,
    IIF(WH_OH > VIP, VIP, WH_OH) AS VIP_AVAILABLE,
    A,
    IIF(WH_OH - VIP > A, A , if (WH_OH - VIP >= 0, WH_OH - VIP, 0)) AS A_AVAILABLE,
    B,
    IIF(WH_OH - VIP - A > B, B, if (WH_OH - VIP - A >= 0, WH_OH - VIP - A, 0)) AS B_AVAILABLE,
    C,
    IIF(WH_OH - VIP - A - B > C, C, if (WH_OH - VIP - A - B >= 0, WH_OH - VIP - A - B, 0)) AS C_AVAIL
FROM tickets_available
...