多个值的 case 语句

case statement for multiple values

当他们同时在两个项目上工作时,我需要获得两者的状态 case 语句不适用于 Status both

ID  Dept    Project Opted Status
123 1234    150       2
123 1234    151       2
456 4567    150       1
456 4567    151       2
789 7890    150       2
789 7890    151       1
101 1010    150       1 
101 1010    151       2

输出应具有状态,例如已为两个项目选择退出 123 id

基于上述table

,case语句应该得到如下输出
ID  Opted in    Opt out
123     NA        both
456    150_y      151_y
789    151_y      150_y
101    150_y      151_y

SELECT A.ID ,
CASE 
WHEN project=150 AND opted status=1 THEN 'prj_150_y'
WHEN project=151 AND opted status=1 THEN 'prj_151_Y'
WHEN project IN (150 ) AND project IN(151)AND opted status=1 THEN 'BOTH_prj_y'
OPT_IN,
CASE 
WHEN project=150 AND opted status=2 THEN 'prj_150_y'
WHEN project=151 AND opted status=2 THEN 'prj_151_y'
WHEN project IN (150 ) AND project IN(151)AND opted status=1 THEN 'BOTH_prj_y'
END AS OPT_OUT
FROM proj_dept A
JOIN
(
SELECT ID,B.*
FROM project_info
    QUALIFY ROW_NUMBER() OVER (PARTITION BY ID,B.dept,project ORDER by optedstatus DESC)=1
WHERE A.ID IN (
7359
) AND project IN (627,152) 
ON 
A.ID=B.ID

这是我使用过的查询,我无法获得 ID 为 123 的 case 语句的输出

你可以这样做:

SELECT CASE WHEN COUNT(project) == 2 THEN 'Both' ELSE MAX(project) END AS 'Project Opted' FROM A LEFT JOIN B ON ... GROUP BY [User]

如果适合您,这只是一个简单的解决方法。

您有一个 table,每个 ID 和项目一行。您想要一个每个 ID 一行的结果。这意味着您必须使用 GROUP BY id 聚合您的行。在您的查询中没有,因此 project IN (150 ) AND project IN(151) 仅指一行和一个项目,等于 project = 150 OR project = 151 或简称 project IN (150, 151)。您必须改为计算匹配项(即您是否在 中有匹配项),为此您将使用条件聚合(聚合函数内的 CASE)。

那么,你的布尔表达式顺序是错误的。您在检查项目 151 之前选择“仅项目 150”。因此您将永远检测到“两者”。

但是,对于 select 子句中的两个状态,您需要两个 CASE 表达式。

SELECT 
  pd.id ,
  CASE 
    WHEN COUNT(CASE WHEN project = 150 AND opted_status = 1 THEN 1 END) > 0
     AND COUNT(CASE WHEN project = 151 AND opted_status = 1 THEN 1 END) > 0
      THEN 'BOTH_prj_y'
    WHEN COUNT(CASE WHEN project = 150 AND opted_status = 1 THEN 1 END) > 0
      THEN 'prj_150_y'
    WHEN COUNT(CASE WHEN project = 151 AND opted_status = 1 THEN 1 END) > 0
      THEN 'prj_151_y'
  END AS opt_in,
  CASE 
    WHEN COUNT(CASE WHEN project = 150 AND opted_status = 2 THEN 1 END) > 0
     AND COUNT(CASE WHEN project = 151 AND opted_status = 2 THEN 1 END) > 0
      THEN 'BOTH_prj_y'
    WHEN COUNT(CASE WHEN project = 150 AND opted_status = 2 THEN 1 END) > 0
      THEN 'prj_150_y'
    WHEN COUNT(CASE WHEN project = 151 AND opted_status = 2 THEN 1 END) > 0
      THEN 'prj_151_y'
  END AS opt_out
FROM proj_dept pd
GROUP BY pd.id
ORDER BY pd.id;