我有一个名为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
有什么想法吗?
答案 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
要获取帐户信息,请使用join
或in
声明:
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
。
这可以通过过滤包含P
和R
的记录并计算返回的每个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
。