多个值的 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;
当他们同时在两个项目上工作时,我需要获得两者的状态 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;