如何在多个表中获得一对多关系中的实例数?

时间:2017-07-13 14:52:35

标签: sql database oracle

我有一个查询,我试图找到特定日期的多个custtype实例。以下查询正常工作:

select idm, count(*) totals
from customer.purch a
where exists (select null
          from customer.name b
          where b.idad = a.id
          and custdate = to_date('5/11/2017', 'MM/DD/YYYY')
          and custtype = 'R'
          )
group by idm
having count(*) > 1;

我遇到的问题是,我不知道如何扩展上述查询以在给定日期找到不同的custtype组合。例如,如何让查询给我一个记录的idm,其中至少有一个custype是R,并且至少有一个其他的custype是'Z'?我认为customer.name字段上的自联接可能是正确的方法,但我不确定如何实现它。谢谢你的时间。

样本数据

Table customer.purch a
_______________
|idm  | id     |
| 1   | 896    |
| 2   | 207    |
| 3   | 359    |
________________

Table customer.name b
______________________________
|idad  |  custdate   |custtype|
| 896  |  5/11/2017  |   R    |
| 896  |  5/11/2017  |   Z    |
| 207  |  5/11/2017  |   R    |
| 207  |  5/11/2017  |   X    |
| 359  |  5/11/2017  |   R    |
| 359  |  5/11/2017  |   Z    |
| 359  |  5/11/2017  |   R    |
| 359  |  5/11/2017  |   R    |
_______________________________


Output 
______________
|IDM  | count |
| 1   |  2    |
| 3   |  4    |
_______________

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以使用聚合和having子句:

select p.idm, count(*) totals
from customer.purch p join
     customer.name n
     on p.id = n.idad
where n.custdate = date '2017-05-11'
group by p.idm
having sum(case when n.custtype = 'R' then 1 else 0 end) > 0 and
       sum(case when n.custtype = 'Z' then 1 else 0 end) > 0;