案例陈述,寻找一个价值

时间:2018-07-10 19:02:38

标签: sql oracle

我试图显示每个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'

3 个答案:

答案 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)

针对您的情况使用ASCIICHR函数,而不要使用 CASE .. WHEN ,如下所示:

SELECT ID, CHR(MAX(ASCII(result))) AS CARE_PLAN
  FROM TAB
 GROUP BY ID
 ORDER BY ID;  

SQL Fiddle Demo

答案 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;