You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:57:03