2016-12-27 66 views
3

我有一张表,其中包含医疗数字和过程的列。有很多行和医疗号码可以重复许多程序;例如:如何从一个表中选择条件跨同一列的多行

Mid_no procedure 
-------------------- 
100.   20 
100.   30 
200.   30 

我想选择具有程序30和不具有程序20在上述例子中所有mid_no,所期望的结果将是:

Mid_no. Procedure 
--------------------- 
200.  30 

回答

3
SELECT t.mid_no, 
    t.procedure 
FROM TABLE t 
WHERE NOT EXISTS 
    (SELECT 1 FROM TABLE t1 WHERE t1.mid_no = t.mid_no AND t1.procedure = 20 
) 
AND t.procedure = 30; 
+0

对不起,我不明白T是我的桌子什么是T1? –

+0

@ahmeddevil它是桌子的别名。这非常有用,因此我们不必编写完整的表名来限定列。 – GurV

+0

@ahmed在上述查询中使用您自己的表名代替** TABLE ** – GurV

1
select mid_no from table where procedure = 30 
intersect 
select mid_no from table where procedure != 20 
0

只需扫描一张桌子,即可使用:

select distinct Mid_no 
from (
     select count(case when procedure=20 then 1 end) over (partition by Mid_no) as has20, 
       count(case when procedure=30 then 1 end) over (partition by Mid_no) as has30, 
       Mid_no 
     from yourTable 
    ) 
where has20 = 0 
    and has30 != 0 

内部查询以两个不同的值计算2030的出现次数,对于每个Mid_no;外部人只挑选没有发生的唯一记录20和至少一个发生的30

相关问题