【问题标题】:SQL Server use IIF calulated column by avoiding "Case expressions may only be nested to level 10"SQL Server 通过避免“案例表达式只能嵌套到级别 10”来使用 IIF 计算列
【发布时间】:2018-12-04 13:46:33
【问题描述】:

下面是我的数据

Table Example

WH_QTY 是可用的总数量,VIP,A,B,C 是优先级。例如,应首先将产品分配给 VIP FIRST,然后再分配给 A、B、C。

通过使用 case 语句,我已经能够获得 VIP_Avail、A_Avail 的正确值,但在转到 B_Avail 时,我收到了以下错误。 "case 表达式只能嵌套到第 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

谢谢, 陈

【问题讨论】:

  • IIF 是一种不同的写法 CASE...WHEN...ELSE END 您是否尝试过其他方法,例如制作一个标量函数返回位,其中包含程序样式 IF ELSE 逻辑?跨度>
  • 我尝试过 IF else 登录但得到了相同的结果。我是初学者
  • 你能用文字而不是代码来解释你的情况吗?很难理解你想要什么,有些条件会重复更多次,例如 ORDER_ITEMS.WH_OH = 0 已经作为第一种情况提到,那为什么还要重复呢?它已被排除,因为您将其用作第一个条件
  • 如果 STK 有 10 并且 VIP 订单是 5 VIP_Available 应该是 5,如果 A 是 10 那么 A_Available 应该是 5,因为 5 已经分配给 VIP。 VIP 端有 3 到 4 个条件需要满足,同样适用于 A_Available。因为它以 VIP_Available 为基础。

标签: sql sql-server nested case iif


【解决方案1】:

假设你想更新表格,我会这样做:

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

【讨论】:

  • @cpatel13 添加了 SELECT 语句供您参考。这是你要找的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多