我试图显示每个ID一行,但它返回三行。
如果ID带有“ y”,则应显示“ y”。
如果显示“ y”和“ r”,则应为“ y”。
如果它具有“ y”,“ r”,“ n”,则应为“ y”。
如果它只是id和'r',则应该是'r'和id而只是'n'然后是'n'。
我似乎无法通过case语句使它正常工作。有任何想法吗?谢谢。
我已经尝试过了:
,CASE WHEN result = 'Y' THEN 'Y'
WHEN result = 'Y' AND result = 'R') THEN 'Y'
WHEN result = 'R' THEN 'R'
ELSE 'N' END AS CARE_PLAN
返回的内容:
ID result
3434 'y'
3434 'r'
3434 'n'
答案 0 :(得分:2)
您可以使用Listagg
函数
编写子查询并DISTINCT
,然后使用Listagg
函数。
SELECT id, Listagg (result, ', ')
within GROUP (ORDER BY result) as CARE_PLAN
FROM (SELECT DISTINCT id,
( CASE
WHEN result = 'Y' THEN 'Y'
WHEN result = 'Y'
AND result = 'R' THEN 'Y'
WHEN result = 'R' THEN 'R'
ELSE 'N'
END ) AS result
FROM t) T
GROUP BY id
sqlfiddle:http://sqlfiddle.com/#!4/02cd5/2
[结果] :
| ID | CARE_PLAN |
|------|-----------|
| 1234 | N, R, Y |
答案 1 :(得分:0)
针对您的情况使用ASCII
和CHR
函数,而不要使用 CASE .. WHEN ,如下所示:
SELECT ID, CHR(MAX(ASCII(result))) AS CARE_PLAN
FROM TAB
GROUP BY ID
ORDER BY ID;
答案 2 :(得分:0)
您似乎希望使用某些条件逻辑进行聚合:
select id,
(case when sum(case when result = 'y' then 1 else 0 end) > 0 then 'y'
when sum(case when result = 'r' then 1 else 0 end) > 0 then 'r'
when min(result) = max(result) and min(result) = 'n' then 'n'
else '?'
end) as new_result
from t
group by id;
如果只有这三个值,那么这种简化的逻辑可能起作用:
select id, max(result) as new_result
from t
group by id;