首页 > 解决方案 > 如何根据条件获得不同的行

问题描述

我有这样的数据表

身份证 | 描述 | 地位
------+------+------------
1 | 美国广播公司 | 完全的
1 | 美国广播公司 | 完全的
1 | 定义 | 计划
1 | 定义 | 计划
1 | 吉 | 改期
1 | 吉 | 改期
2 | 美国广播公司 | 完全的
2 | 定义 | 计划
2 | 吉 | 计划

我需要根据状态为每个 ID 获取一行。一行代表Planned另一个,如果一个 ID 同时具有状态Completed& Rescheduled,则Rescheduled必须选择行,否则Completed

例如

ID 1 具有Planned, Completed&Rescheduled状态。输出应如下所示

ID = 1 的一行Planned和 ID = 1 的一行“重新安排”

身份证 | 描述 | 地位
------+------+------------
1 | 吉 | 改期
1 | 定义 | 计划
2 | 美国广播公司 | 完全的
2 | 定义 | 计划

标签: sqlsql-server

解决方案


您可以这样做,然后返回(作为您的预期输出)和的每个组合NOT EXISTS的最小值:descidstatus

select t.id, min(t.[desc]) [desc], t.status 
from tablename t
where status in ('Planned', 'Rescheduled')
or not exists (
  select 1 from tablename
  where id = t.id and status = 'Rescheduled'
)
group by t.id, t.status
order by t.id, t.status

请参阅演示
结果:

> id | desc | status     
> -: | :--- | :----------
>  1 | def  | Planned    
>  1 | ghi  | Rescheduled
>  2 | abc  | Completed  
>  2 | def  | Planned 

推荐阅读