2011-12-13 57 views
3

我有以下两个表:Oracle的组/数查询

TableOne 
======== 
Id1|ColA1|ColB1|ColC1|ColD1|ColE1 
-------------------------------- 
    1| AFoo|BFoo |CFoo | DFoo| EFoo 
    2| AFoo|BBar |CFoo | DFoo| EFoo 

TableTwo 
======== 
Id2|ColA2|ColB2|ColC2 
--------------------- 
11| 1 |ABC |NOP | 
12| 1 |ABC |QRS | 
13| 1 |DEF |TUV | 
14| 1 |DEF |WXY | 
15| 1 |DEF |FGH | 
16| 2 |ABC |NOP | 

我运行下面的查询:

select t1.*, t2.* 
from TableOne t1 
inner join TableTwo t2 on t2.ColA2=t1.Id1 
where t1.ColA1='AFoo' 

,并得到以下结果:

Result 
====== 
Id1|ColA1|ColB1|ColC1|ColD1|ColE1|Id2|ColA2|ColB2|ColC2 
------------------------------------------------------- 
    1| AFoo|BFoo |CFoo | DFoo| EFoo| 11| 1 | ABC | NOP 
    1| AFoo|BFoo |CFoo | DFoo| EFoo| 12| 1 | ABC | QRS 
    1| AFoo|BFoo |CFoo | DFoo| EFoo| 13| 1 | DEF | TUV 
    1| AFoo|BFoo |CFoo | DFoo| EFoo| 14| 1 | DEF | WXY 
    1| AFoo|BFoo |CFoo | DFoo| EFoo| 15| 1 | DEF | FGH 
    2| AFoo|BBar |CFoo | DFoo| EFoo| 16| 2 | ABC | NOP 

我真的想要返回的是:

Desired Result 
====== 
Id1|MaxDup 
---------------------------------------- 
    1| 3 (This is because there are 3 DEF records) 
    2| 1 (This is because there is 1 ABC record) 

所以,我试图跟踪出现在每个TableOne行ColB2出现的最大数量。在上面的例子中,1的ID1有两个ABC记录和三个与它关联的DEF记录。由于DEF记录比ABC记录更多,我想要返回DEF记录的计数。

任何人都可以提供一个可以证明这一点的工作示例吗?

回答

1

试试这一个(我没有测试过):

with t2 as (
    select ColA2, ColB2, count(*) cnt 
    from TableTwo 
    group by ColA2, ColB2 
) 
select t1.Id1, 
( select max(cnt) MaxDup 
    from t2 
    where t2.ColA2=t1.Id1) 
from TableOne t1 
+0

是的,很棒!谢谢! – user973479

0

这是SQL Server代码,但我认为它可以被安全地转移到甲骨文:

select id1,cola1,colb1,colc1,cold1,cole1,max(dup) as dup2 from (
     select t1.id1, t1.cola1, t1.colb1, t1.colc1,t1.cold1,t1.cole1, t2.colb2,count(*) as dup 
     from t1 
     inner join t2 on t2.cola2=t1.Id1 
     where t1.cola1='Afoo' 
     group by t1.id1, t1.cola1, t1.colb1, t1.colc1,t1.cold1,t1.cole1, t2.colb2) 
    tab 
    group by id1,cola1,colb1,colc1,cold1,cole1 

它的工作原理上的SQL服务器,并通过包含在子查询中可以只提取id1和dup2。试图扩大你的数据集,它的作品。

+0

如果您使用了OP给出的列名称,那么测试您是否会使用quesy会更容易。 – APC

+0

更正,作品。 –

0

这是根据您的测试数据得出的结果。

SQL> select  
     cola2 
     , cnt as maxDup 
from (  
     select  
       cola2 
       , colb2 
       , cnt 
       , rank() over (partition by cola2 order by cnt desc) cnt_rnk 
     from (
       select cola2 
         , colb2 
         , count(*) as cnt 
       from TableTwo 
       group by cola2, colb2 
     ) 
    )   
where  cnt_rnk = 1 
/
    2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
COLA  MAXDUP 
---- ---------- 
1    3 
2    1 

SQL> 

最里面的查询计数重复。中间查询排列重复计数。最高计数组合的最外面的查询过滤器:

0

也许这个?

SELECT t2.id2 id, count(t2.ColB2) MaxDup 
FROM TableTwo t2 
WHERE EXISTS(
     SELECT * FROM TableOne t1 
     WHERE t1.id1 = t2.id2 
     AND t1.ColA1='AFoo') 
AND rownum < 2 
GROUP BY t2.id2, t2.ColB2 
ORDER BY MaxDup desc;