database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 34696 게시물 읽기
No. 34696
DB 초보 질문 드려요. 바쁘지 않으시면 한번 봐주세요 ^^
작성자
김세영(endeks)
작성일
2008-11-06 11:32
조회수
2,743
PART 일자 상담원명 LogIn LogOut  인입호  발신호(Action List)  기타(일반OB) 호전환  총통화시간
콜 건수 통화시간 평균시간 콜 건수 통화시간 평균시간 콜 건수 통화시간 평균시간 콜 건수 통화시간 평균시간
 정보 총계       124  01:34:49  00:00:46  00:22:43  00:02:31  00:00:00  00:00:00  133  01:57:32  00:00:53 
 정보 20060101  김지영 19:08:48  19:09:07  10  00:01:44  00:00:10  00:00:00  00:00:00  00:00:00  00:00:00  10  00:01:44  00:00:10 
 정보 20060101  조미경 10:59:24  22:00:00  124  01:24:26  00:00:41  00:22:43  00:02:31  00:00:00  00:00:00  133  01:47:09  00:00:48 
 정보
일계       124  01:34:49  00:00:46  00:22:43  00:02:31  00:00:00  00:00:00  133  01:57:32  00:00:53 


이렇게 통계를 내는 건대요. 이번에 추가사항이 생겼네요.

일자별, 상담원별, 월별 검색조건을 추가해서 일자별 합계, 일평균을(총계는 빠지고 일계가 보이는 부분에 추가해야대요) 내고

상담원별 합계, 일평균이 보이고 월별도 같은 방법으로 해서 3개의 정렬조건이 생겨야 대거든요.

그런데 쿼리를 아무리 봐도 현재 화면의 총계와 일계를 구해오는게 이해가 안가서요. 약간이라도 좋으니 조언 부탁드립니다. 쿼리는 이래요

select                              
      decode(ta.seq,'3','9999999','1',ta.stat_date||'1',ta.stat_date||'0') ,   
      decode(ta.seq,'1',ta.stat_date,'2','일계','총계') ,   
     decode(substr(max(ta.group_code),1,2),'21','정보','23','CS','22','음성인식','24','캠페인') ,
      decode(ta.seq,'1',ta.agent_name,' ') ,    
      decode(ta.seq,'1',ta.login_tme,' ') ,
     decode(ta.seq,'1',ta.logout_tme,' '),   
      max(ta.total_time),               
                            
      max(ta.ib_cnt)call1,                   
      max(ta.ib_call_tme),              
      decode(max(ta.ib_cnt) , 0, 0 ,round(max(ta.ib_call_tme)/max(ta.ib_cnt)))avg1,        
      max(ta.al_cnt)call2,                   
      max(ta.al_call_tme),              
      decode( max(ta.al_cnt), 0 ,0 ,round(max(ta.al_call_tme)/max(ta.al_cnt)))avg2,        
      max(ta.ob_cnt)call3,                   
      max(ta.ob_call_tme),              
      decode( max(ta.ob_cnt), 0 ,0 ,round(max(ta.ob_call_tme)/max(ta.ob_cnt)))avg3,
   
                                   
      max(ta.call_trsf),
     decode((max(ta.ib_cnt)+max(ta.al_cnt)+max(ta.ob_cnt)),0,0, ((max(ta.ib_cnt)+max(ta.al_cnt)+max(ta.ob_cnt)))) tot_cnt,
     decode((max(ta.ib_call_tme)+max(ta.al_call_tme)+max(ta.ob_call_tme)),0,0,((max(ta.ib_call_tme)+max(ta.al_call_tme)+max(ta.ob_call_tme)))) tot_call_tme,
     decode(decode((max(ta.ib_cnt)+max(ta.al_cnt)+max(ta.ob_cnt)),0,0, ((max(ta.ib_cnt)+max(ta.al_cnt)+max(ta.ob_cnt)))),0,0,
            round(decode((max(ta.ib_call_tme)+max(ta.al_call_tme)+max(ta.ob_call_tme)),0,0,((max(ta.ib_call_tme)+max(ta.al_call_tme)+max(ta.ob_call_tme))))/
      decode((max(ta.ib_cnt)+max(ta.al_cnt)+max(ta.ob_cnt)),0,0, ((max(ta.ib_cnt)+max(ta.al_cnt)+max(ta.ob_cnt)))))) tot_avg,    
      max(ta.wait_time),                
        decode((max(ta.ib_cnt)+max(ta.al_cnt)+max(ta.ob_cnt)),0,0, round( max(ta.wait_time)/(max(ta.ib_cnt)+max(ta.al_cnt)+max(ta.ob_cnt)))) avg_wait,              
      max(ta.work_time),                
     decode((max(ta.ib_cnt)+max(ta.al_cnt)+max(ta.ob_cnt)),0,0, round( max(ta.work_time)/(max(ta.ib_cnt)+max(ta.al_cnt)+max(ta.ob_cnt)))) avg_work,                        
      max(ta.dish_time),                
      max(ta.educ_time),                
      max(ta.rest_time),                
      max(ta.agent_id)                   
                                        
     from                               
     (                                  
      select                            
         d.seq,      a.stat_date,      a.agent_id,      b.agent_name,      c.group_code, to_char(a.login_tme,'HH24:MI:SS') login_tme,    to_char(a.logout_tme,'HH24:MI:SS') logout_tme,  a.total_time,  
         e.ib_cnt ,e.al_cnt, e.ob_cnt,   e.ib_call_time ib_call_tme, e.al_call_time al_call_tme,e.ob_call_time ob_call_tme,                                         
      e.call_trsf,   a.work_time,     a.wait_time,     a.rest_time ,    a.dish_time,    a.educ_time   
      from                              
        agent_call a,                   
        agent b,                        
        (select distinct agent_id, group_code from agent_group where group_type = '01'  and group_code like '2101%' ) c,                                               
        (select to_char(rownum) seq from agent where rownum <= 3) d  ,                      
        (select agent_id,service_dte, sum(decode(call_type,1,1,0)) ib_cnt ,sum(decode(call_type,2,1,0)) al_cnt, sum(decode(call_type,3,1,0)) ob_cnt,sum(decode(call_flag,2,1,0)) call_trsf , 
             sum(nvl(decode(call_type,1,(call_end_tme - call_str_tme)*3600*24,0),0)) ib_call_time,    
             sum(nvl(decode(call_type,2,(call_end_tme - call_str_tme)*3600*24,0),0)) al_call_time,    
             sum(nvl(decode(call_type,3,(call_end_tme - call_str_tme)*3600*24,0),0)) ob_call_time     
             from CALL_HISTORY          
          where service_dte between '20060101' and '20060101'     
          group by service_dte, agent_id                          
          order by agent_id ) e         
         where                          
        a.agent_id = b.agent_id         
        and a.agent_id = c.agent_id     
        and a.agent_id = e.agent_id     
        and a.stat_date between '20060101' and '20060101'          
       ) ta                             
     group by                           
      decode(ta.seq,'3','9999999','1',ta.stat_date||'1',ta.stat_date||'0'),     
      decode(ta.seq,'1',ta.stat_date,'2','일계','총계'),                          
      decode(ta.seq,'1',ta.agent_name,' '),                                    
      decode(ta.seq,'1',ta.login_tme,' ') ,
   decode(ta.seq,'1',ta.logout_tme,' ')                 
     order by 1 desc ,2, 3 

질문을 많이 안해봐서 이렇게 올려도 되는건지 모르겠네요. 잘못된부분 너그럽게 이해해 주세요^^


 

이 글에 대한 댓글이 총 1건 있습니다.

쿼리중간에 보시면 (select to_char(rownum) seq from agent where rownum <= 3) d 라는 부분이 보이고 Where절에 아무것도 조인하지 않고 있죠?


이렇게 하면 원래 나와야 할 결과가 여러개로 복사되어 출력되게 됩니다.


실제로 해당 쿼리를 Group으로 묶지 않고 보시면 똑같은 데이터가 3개씩 출력되고 있을 거예요.


이런 조인방식을 Cartesian product라고 합니다.


여튼, 이렇게 결과를 여러 개로 복사해 놓고 일정한 기준에 따라 합산되도록 하면 원하는 데로 총계, 소계 등을 구할 수 있습니다.


최근에야 Rollup, Cube, Grouping Sets 등이 지원되서 그것을 활용하지만, 그전까진 저렇게 작성했었습니다.


'대용량 데이터베이스 솔루션' 시리즈나 웹검색을 하시면 자세한 설명을 보실 수 있습니다.^^

지나가다..님이 2008-11-06 13:12에 작성한 댓글입니다.
이 댓글은 2008-11-06 13:13에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
34699쿼리를 최적화 하고 싶어여.. 조언 부탁드려여 [2]
오혜진
2008-11-06
2537
34698다중사용자 상황에서 외래키 없이 참조 무결성을 유지하기 [1]
김흥수
2008-11-06
2667
34697다중insert 문의
옹달샘
2008-11-06
2736
34696DB 초보 질문 드려요. 바쁘지 않으시면 한번 봐주세요 ^^ [1]
김세영
2008-11-06
2743
34695오라클 세션을 체크할때 ora-03114 이외에 더 체크해야 할값이 있을까요? [1]
오라초보
2008-11-06
3564
34694가입 / 해지 이력만들기 [4]
박병준
2008-11-05
2742
34693쿼리 도와주세요. [2]
행동하자
2008-11-05
2085
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다