选择与一个列值关联但不与另一个列值关联的客户端

时间:2016-09-23 15:04:44

标签: sql-server sql-server-2008-r2 group-by where having

我正在尝试制作一个报告列出活动客户端(case_status ='A'),这些客户端没有更新的文档的旧版本,但我们的数据库布局方式所有文档都列在一个表,所以一些客户将附加十几个不同的文件。其中一些是重复文件。

实施例

patient_id     Doc_code
p01            doc1
p01            doc2
p01            doc3
po1            doc4
p02            doc2
po2            doc3

我需要知道谁拥有'DIAGDOC'的doc_code,并且没有'DIAGDOC5'的doc_code,所以我们知道谁需要更新。

select 

de.patient_id,
de.episode_id

from doc_entity de
join patient p
on p.patient_id = de.patient_id and p.episode_id = de.episode_id
where p.case_status = 'A' 

group by de.patient_id, de.episode_id, de.doc_code
having (de.doc_code in ('DIAGDOC'))and (de.doc_code not in ('DIAGDOC5'))
order by de.patient_id, de.episode_id 

2 个答案:

答案 0 :(得分:1)

except子句会起作用吗?

select
de.patient_id,
de.episode_id

from doc_entity de
join patient p
on p.patient_id = de.patient_id and p.episode_id = de.episode_id
where p.case_status = 'A' 
and de.doc_code = 'DIAGDOC'

EXCEPT

select 

de.patient_id,
de.episode_id

from doc_entity de
join patient p
on p.patient_id = de.patient_id and p.episode_id = de.episode_id
where p.case_status = 'A' 
and de.doc_code = 'DIAGDOC5'*

顶部块返回带有diagdoc的所有行,而except块删除所有带有diagdoc5的行,只留下那些带有过期文档的行

答案 1 :(得分:1)

以下是否有效 -

select 
    aa.patient_id, aa.episode_id 
from 
(
    select  
            de.patient_id
        ,   de.episode_id
        ,   MAX(case doc_code WHEN 'DIAGDOC'  THEN 'YES'  ELSE 'NO' end) as 'DIAGDOCExists'
        ,   MAX(case doc_code WHEN 'DIAGDOC5' THEN 'YES'  ELSE 'NO' end) as 'DIAGDOC5Exists'
    from 
        doc_entity de join patient p on p.patient_id = de.patient_id and p.episode_id = de.episode_id
    where 
        p.case_status = 'A' 
    group by 
        de.patient_id, de.episode_id
) as aa where aa.DIAGDOCExists = 'YES' and aa.DIAGDOC5Exists = 'NO'