A B
001 a
002 b
002 0.1
003 0.1
规则:
表中,如果对于一个A(比如002)如果对应两个B列的值(b和0.1),那么取出B列中不等于0.1的那条。
最后结果应该为
A B
001 a
002 b
001 a
002 b
002 0.1
003 0.1
规则:
表中,如果对于一个A(比如002)如果对应两个B列的值(b和0.1),那么取出B列中不等于0.1的那条。
最后结果应该为
A B
001 a
002 b
003 0.1
网友的回复
http://topic.csdn.net/u/20101101/15/6a9df61f-cd12-42b6-bba7-7fedf8639e41.html
【经典回复1 】
WITH tab AS(
SELECT '001'a, 'a' b FROM dual UNION ALL
SELECT '002', 'b' FROM dual UNION ALL
SELECT '002', '0.1' FROM dual UNION ALL
SELECT '003', '0.1' FROM dual
)
SELECT a,b FROM (
SELECT a,b,Decode(b,'0.1',1,0) bb,Count(1)over(PARTITION BY a) cnt FROM tab
)
WHERE cnt=1 OR (cnt!=1 AND bb=0)
其中Count(1)可以修改为Count(a)。Count(1) over(partition by a)表示以a分组后,计算每个组的记录数。相当于把group by 和Count从where 条件后拿到select里。
很经典
【经典回复2】
select * from tt a where b<>'0.1' or (b='0.1' and not exists(select 1 from tt b where a.a=b.a and b.b<>'0.1'));