选择至少具有P和R的数据

时间:2013-03-27 15:31:25

标签: sql select relational-division

我有一个名为Table1的表,如下所示:

ID  AccountNo     Trn_cd
1   123456           P
2   123456           R
3   123456           P
4   12345            P
5   111              R
6   111              R
7   5625             P

我想显示那些记录不会出现多次(重复)且trn_cd至少同时出现P和R的记录。

在这种情况下,输出应该是这样的:

ID  AccountNo     Trn_cd
1   123456           P
2   123456           R
3   123456           P

我已经完成了这个sql而不是我想要的结果:

select * from Table1 
where AccountNo IN 
(select accountno from table1 
where trn_cd = 'P' or trn_cd = 'R' 
group by AccountNo having count(*) > 1) 

结果如下所示,不应出现AccountNo 111,因为111没有trn_cd P:

ID  AccountNo   Trn_cd
1   123456        P
2   123456        R
3   123456        P
5   111           R
6   111           R

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

为此使用聚合。要获取帐号:

select accountNo
from table1
having count(*) > 1 and
       sum(case when trn_cd = 'P' then 1 else 0 end) > 0 and
       sum(case when trn_cd = 'N' then 1 else 0 end) > 0

要获取帐户信息,请使用joinin声明:

select t.*
from table1 t
where t.accountno in (select accountNo
                      from table1
                      having count(*) > 1 and
                             sum(case when trn_cd = 'P' then 1 else 0 end) > 0 and
                             sum(case when trn_cd = 'N' then 1 else 0 end) > 0
                     )

答案 1 :(得分:0)

此问题称为Relational Division

这可以通过过滤包含PR的记录并计算返回的每个AccountNo的记录,并使用COUNT(DISTINCT Trn_CD) = 2再次过滤来解决。

SELECT  a.*
FROM    tableName a
        INNER JOIN
        (
            SELECT  AccountNo
            FROM    TableName
            WHERE   Trn_CD IN ('P','R')
            GROUP   BY AccountNo
            HAVING  COUNT(DISTINCT Trn_CD) = 2
        ) b ON a.AccountNO = b.AccountNo

输出

╔════╦═══════════╦════════╗
║ ID ║ ACCOUNTNO ║ TRN_CD ║
╠════╬═══════════╬════════╣
║  1 ║    123456 ║ P      ║
║  2 ║    123456 ║ R      ║
║  3 ║    123456 ║ P      ║
╚════╩═══════════╩════════╝

要获得更快的效果,请在列INDEX上添加AccountNo