그룹별 count시 카테시안곱을 이용해 테이블에 1번만 접근해서 구하고자 합니다. 0 3 2,407

by 무뚝이 [SQL Query] cartesian곱 group by [2013.07.16 16:32:44]


아래테이블처럼 정보가 있다고 할때
결과처럼 구분1,구분2별로 작업할ID와 실제작업ID별로 group by해서 count를 구한다음 비율을 구하는 부분인데
테이블 2번 접근 안하고
1번만 접근해서 결과처럼 뽑아내는 방법있나요.

작업할ID 실제작업ID 구분1 구분2
A A C 20121231
A B C 20121231
A A C 20121231
B B C 20121231
A A D 20120630


==>결과
구분1 구분2 실제작업ID 실제작업ID갯수(1) 작업할ID 작업할ID갯수(2) 비율((1)/(2)) * 100
C 20121231 A 2 A 3 66.66666667
D 20120630 A 1 A 1 100
C 20121231 B 2 B 1 200
by 윤 [2013.07.16 16:57:07]
with T as(
select 'A' a,'A' b,'C' c,20121231 d from DUAL
union all select 'A','B','C',20121231 from DUAL
union all select 'A','A','C',20121231 from DUAL
union all select 'B','B','C',20121231 from DUAL
union all select 'A','A','D',20120630 from DUAL
)
select T1.C,T1.D,a,ACNT,B,BCNT
      ,round((bcnt/acnt)*100,7) result
      from(select C,D,a,COUNT(a)ACNT from T
      group by C,D,a)T1,(select C,D,B,COUNT(B)BCNT from T
      group by C,D,B)T2
      where T1.a=T2.B
      and T1.C=T2.C
      and T1.D=T2.D
      order by a,c;

ㅎㅎ...부족한탓에 저도 질문자님과 같은 방식으루 짜지는 ㅜㅜ..
배우다갑니다.

by 용근님 [2013.07.16 16:59:56]
SELECT 구분1
   -- 구분2는 max로 할껀지 min으로 할껀지 group by 에 포함시킬껀지.
   , 구분2
   , DECODE ( lv, 1, 실제작업ID, 2, 작업할ID ) 실제작업ID
   , COUNT ( DECODE ( lv, 1, 1 ))       실제작업ID갯수
   , DECODE ( lv, 1, 실제작업ID, 2, 작업할ID ) 작업할ID
   , COUNT ( DECODE ( lv, 2, 1 ))       작업할ID갯수
   , COUNT ( DECODE ( lv, 1, 1 ))
   / NVL ( COUNT ( DECODE ( lv, 2, 1 )), 0, NULL )
   * 100                    비율
 FROM t
   , ( SELECT level lv FROM dual CONNECT BY LEVEL <= 2 )
 GROUP BY DECODE ( lv, 1, 실제작업ID, 2, 작업할ID )
    , 구분1
    , 구분2

by DIIIN [2013.07.16 17:24:10]

작업할ID 실제작업ID 구분1 구분2
A A C 20121231
A B C 20121231
A A C 20121231
B B C 20121231
A A D 20120630

좀 이해가 안가는 부분이 있는데요.
결과값이 아래줄은 나오는데, 윗줄은 경우에서 제외되네요?
구분 C 에서 실제작업이 B 로 된 것은 작업할ID A,B 두 개가 나와야 되는 것 아닌가요?
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입