2011-12-13 2 views
3

나는 다음과 같은 두 개의 테이블이 있습니다오라클 그룹/카운트 쿼리

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 레코드가 있습니다. ABC 레코드보다 DEF 레코드가 더 많으므로 반환되는 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 서버 코드입니다,하지만 난 그것을 안전하게 오라클로 전송 될 수 있다고 생각 :

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가 제공 한 열 이름을 사용했다면 문제가 해결되었는지 테스트하는 것이 더 쉬울 것입니다. – 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;