CASE WHEN - 多个条件 - 相同参考的多行

Posted

技术标签:

【中文标题】CASE WHEN - 多个条件 - 相同参考的多行【英文标题】:CASE WHEN - Multiple Conditions - Over Multiple Rows of same reference 【发布时间】:2021-12-31 11:27:42 【问题描述】:

我正在尝试通过使用 CASE WHEN 来确定某些内容来创建一个标志,但它一直返回“single_state” - 我猜是因为它没有将 CASE WHEN 应用于所有具有 o/n 1234 的行,这是我需要帮助的位.

我的预期输出是前 3 行具有“multi_state”,因为它们都是相同的 o/n,最后一行具有“single_state”,因为它既没有分组也没有超过 1 个状态。

下面的例子:

数据表

o/n      sku     order_type    state   state_check
1234    ABC987    Grouped     express
1234    BCD654    Grouped     arrived
1234    CDF321    Grouped     shipped
5679    GBT104   Not Grouped  express

查询

SELECT o/n, SKU, order_type, state, 
CASE WHEN order_type is "Grouped" AND (state = "express" AND state = "arrived") THEN "multi_state"
CASE WHEN order_type is "Grouped" AND (state = "express" AND state = "shipped") THEN "multi_state"
ELSE "single_state"
END AS state_check
FROM data.table

【问题讨论】:

标记您的特定RDBMS 您的订单号 1234 都为order_type分组,所以这还没有提供您需要的信息吗? case when order_type='grouped' then 'multistate' else 'singlestate' end...? 请用您正在使用的 DBMS 标记您的请求。例如,我的答案是标准 SQL,但您的 DBMS 可能仍然不符合查询。始终使用 DBMS 标记您的 SQL 请求,以便只获得适合您的答案。 【参考方案1】:

multi_stateCASEs 都检查 state 是否同时具有值​​ expressarrived/shipped。一列不能同时有多个值。

您可以使用IN() 接受多个值作为multi_state

SELECT o/n
    , sku
    , order_type
    , state
    , CASE
        WHEN order_type = 'Grouped' AND state IN('express', 'arrived', 'shipped') THEN 'multi_state'
        ELSE 'single_state'
    END AS state_check
FROM data.table

【讨论】:

【参考方案2】:

您需要一个窗口函数(带有OVER 子句的聚合函数)来一次查看多行。

SELECT 
  "o/n", sku, order_type, state,
  CASE
    WHEN order_type <> 'Grouped' THEN
      'single_state'
    WHEN COUNT(DISTINCT state) OVER (PARTITION BY "o/n", order_type) = 1 THEN
      'single_state'
    ELSE
      'multi_state'
  END
FROM data.table
ORDER BY "o/n", sku;

【讨论】:

以上是关于CASE WHEN - 多个条件 - 相同参考的多行的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django 的 Case/When 查询集条件来设置多个值?

关于CASE WHEN的多条件汇总问题

case when用法

SQL语句中case,when,then的用法

case when用法sql

SQL 中 where 条件中 in 后面 加 CASE WHEN 语句 报错