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_state
的 CASE
s 都检查 state
是否同时具有值 express
和 arrived
/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 - 多个条件 - 相同参考的多行的主要内容,如果未能解决你的问题,请参考以下文章