如何在T-SQL中基于同ID多值用CASE语句生成新状态列?
T-SQL 基于多列条件生成新列的解决方案
需求说明
针对表[dbo].[tr](包含col1(ID列)、col2(值列)),需生成新列Status,满足以下规则:
- 若某ID对应的记录中至少有一条
col2为空字符串'',则该ID所有行的Status为'Open' - 若
col2的值为'X'且该ID无空字符串记录,则Status为'Closed' - 若
col2的值为空字符串'',则Status为'Open'
示例数据
| col1 | col2 |
|---|---|
| 1 | X |
| 1 | |
| 2 | X |
| 3 | |
| 4 | X |
| 4 | X |
预期结果
| col1 | col2 | Status |
|---|---|---|
| 1 | X | Open |
| 1 | Open | |
| 2 | X | Closed |
| 3 | Open | |
| 4 | X | Closed |
| 4 | X | Closed |
实现代码
SELECT col1, col2, CASE -- 优先判断当前ID分组内是否存在空字符串记录 WHEN MAX(CASE WHEN col2 = '' THEN 1 ELSE 0 END) OVER (PARTITION BY col1) = 1 THEN 'Open' -- 无空字符串时,根据col2的值判断 WHEN col2 = 'X' THEN 'Closed' ELSE 'Open' END AS Status FROM [dbo].[tr] ORDER BY col1;
代码解释
- 使用窗口函数
MAX() OVER (PARTITION BY col1)对每个ID分组,统计该组内是否存在col2为空的记录(返回1表示存在) - 规则优先级最高的是ID组内是否有空白值,因此CASE语句先判断该条件,满足则所有行直接返回
'Open' - 若ID组无空白值,则根据
col2的具体值返回对应状态,确保单个值的ID也符合规则
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

