SQL中使用CASE表达式比对多行间两列数据的问题求助
问题根因
你当前的代码逻辑存在根本错误:所有字段比较都是同一条记录的字段与自身比较:
pprof.description = pprof.description永远返回真PCtrl.[sequence] <> PCtrl.[sequence]永远返回假
因此整个WHEN判断条件永远不成立,自然不会返回任何结果。
实现方案
要实现跨行比对相同列1值、不同列2值的需求,你需要先把同组(列1值相同)的其他行数据关联到当前行,有两种常见实现思路:
方案1:自关联实现
先对数据表做自连接,关联条件为列1值相等,且列2值不等,示例逻辑参考:
SELECT t1.列1, t1.列2, -- 满足条件时取同组列3为Yes的值 CASE WHEN t2.列1 IS NOT NULL THEN 'Yes' ELSE t1.列3 END AS 列3 FROM 你的表 t1 LEFT JOIN 你的表 t2 ON t1.列1 = t2.列1 AND t1.列2 <> t2.列2 AND t2.列3 = 'Yes'
方案2:窗口函数实现
如果你的数据库支持窗口函数,可以用窗口函数直接取同组的对应值,不需要关联:
SELECT 列1, 列2, CASE WHEN COUNT(*) OVER (PARTITION BY 列1) > 1 -- 同列1值存在多行 THEN MAX(CASE WHEN 列3 = 'Yes' THEN 'Yes' END) OVER (PARTITION BY 列1) ELSE 列3 END AS 列3 FROM 你的表
适配你的实际业务代码
你提供的嵌套CASE逻辑可以调整为如下形式(以窗口函数方案为例,你可以根据你的表关联逻辑替换自连接版本):
( CASE WHEN tenure.description NOT IN ('casual','co-op','fswep') THEN CASE -- 替换为同组跨行判断逻辑,这里以pprof.description为分组键为例 WHEN COUNT(*) OVER (PARTITION BY pprof.description) > 1 AND MAX(PCtrl.[sequence]) OVER (PARTITION BY pprof.description) <> MIN(PCtrl.[sequence]) OVER (PARTITION BY pprof.description) THEN CASE WHEN (PEmp.Employee_Number = PEmp3.Supervisor_Number) THEN 'Yes' ELSE 'No' END END END ) AS 'People Manager'
核心调整点就是把原来的同字段自比较,替换为同分组下的聚合判断:
- 用
PARTITION BY pprof.description把所有description相同的行归为一组 - 用
MAX(PCtrl.[sequence]) <> MIN(PCtrl.[sequence])判断该组内存在不同的sequence值,也就是满足你要的「列1相同、列2不同」的条件
内容的提问来源于stack exchange,提问作者jss123
相关产品推荐
相关产品推荐

