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 38543 게시물 읽기
No. 38543
속도때문에 union을 빼고 싶은데 잘안되네요... 방법이 없을까요?
작성자
이재호(e1lineside)
작성일
2011-05-06 14:51ⓒ
2011-05-06 14:52ⓜ
조회수
4,674

union 때문인지 쿼리 툴에서 돌렸을때는 30초정도고

업무중에 돌리면 2분정도 나오네요;;;

이것저것 case 문도 써보고  inline view로 안쪽에서 데이터 뽑아서 해볼려고 하고 있는데

몇일동안 해보고 있는데 잘안되네요 ㅠㅠ

뭔가 다른 방법이 없을까요?

부탁드립니다~~

0 로그인 10
0 준비중 11
0 통화중 12
0 작업     13
0 대기     14
0 휴식     15
0 교육     16
0 회의     17
0 식사     18
0 면담     19
0 업무     20
0 지원     21
0 기타     22

 SELECT  A.cnt AS cnt                                            
    ,A.cnt_name AS cnt_name       
    ,A.ord AS ord
          
 FROM
 (                 
     SELECT count(A.seqno) AS cnt    
     ,'로그인' AS cnt_name      
     ,'10' AS ord         
     FROM TBL_AGENT_STATUS A       
  ,(SELECT empno, MAX(seqno) seqno 
    FROM TBL_AGENT_STATUS       
    GROUP BY empno          
  ) B ,TBL_AGENT C         
  WHERE A.seqno = B.seqno       
  AND A.empno = C.empno       
  AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')       
  AND C.duty_cd = '10'       
     AND A.AGENT_STATE <> '1' and A.AGENT_STATE <> '9'     
    
     UNION ALL 
              
     SELECT count(A.seqno) AS cnt    
     ,'준비중' AS cnt_name       
     ,'11' AS ord         
     FROM TBL_AGENT_STATUS A       
  ,(SELECT empno, MAX(seqno) seqno   
    FROM TBL_AGENT_STATUS       
    GROUP BY empno          
  ) B ,TBL_AGENT C         
  WHERE A.seqno = B.seqno       
  AND A.empno = C.empno       
  AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')       
  AND C.duty_cd = '10'       
     AND   A.AGENT_STATE = '2'      
     AND   (A.ir_code = '0')     
    
     UNION ALL   
         
     SELECT count(A.seqno) AS cnt    
     ,'통화중' AS cnt_name    
     ,'12' AS ord      
     FROM TBL_AGENT_STATUS A     
  ,(SELECT empno, MAX(seqno) seqno 
    FROM TBL_AGENT_STATUS       
    GROUP BY empno          
  ) B ,TBL_AGENT C         
  WHERE A.seqno = B.seqno       
  AND A.empno = C.empno       
  AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')       
  AND C.duty_cd = '10'       
     AND   A.AGENT_STATE = '4' 
         
     UNION ALL       
    
     SELECT count(A.seqno) AS cnt    
     ,'작업' AS cnt_name     
     ,'13' AS ord      
     FROM TBL_AGENT_STATUS A     
  ,(SELECT empno, MAX(seqno) seqno 
    FROM TBL_AGENT_STATUS       
    GROUP BY empno          
  ) B ,TBL_AGENT C         
  WHERE A.seqno = B.seqno       
  AND A.empno = C.empno       
  AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')       
  AND C.duty_cd = '10'       
     AND   A.agent_state = '2' and A.agent_state = '5' and A.agent_state = '6'     
     AND   A.ir_code = '211'        
    
     UNION ALL          
    
     SELECT count(A.seqno) AS cnt    
     ,'대기' AS cnt_name       
     ,'14' AS ord         
     FROM TBL_AGENT_STATUS A       
  ,(SELECT empno, MAX(seqno) seqno   
    FROM TBL_AGENT_STATUS       
    GROUP BY empno          
  ) B ,TBL_AGENT C         
  WHERE A.seqno = B.seqno       
  AND A.empno = C.empno       
  AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')       
  AND C.duty_cd = '10'       
     AND   A.AGENT_STATE = '2'      
     AND   (A.ir_code = '209' OR A.ir_code = '210')     
    
     UNION ALL       
    
     SELECT count(A.seqno) AS cnt    
     ,'휴식' AS cnt_name     
     ,'15' AS ord      
     FROM TBL_AGENT_STATUS A     
  ,(SELECT empno, MAX(seqno) seqno 
    FROM TBL_AGENT_STATUS       
    GROUP BY empno          
  ) B ,TBL_AGENT C         
  WHERE A.seqno = B.seqno       
  AND A.empno = C.empno       
  AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')       
  AND C.duty_cd = '10'       
     AND   A.AGENT_STATE = '2'      
     AND   A.ir_code = '201'        
    
     UNION ALL       
    
     SELECT count(A.seqno) AS cnt    
     ,'교육' AS cnt_name     
     ,'16' AS ord      
     FROM TBL_AGENT_STATUS A     
  ,(SELECT empno, MAX(seqno) seqno 
    FROM TBL_AGENT_STATUS       
    GROUP BY empno          
  ) B ,TBL_AGENT C         
  WHERE A.seqno = B.seqno       
  AND A.empno = C.empno       
  AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')       
  AND C.duty_cd = '10'       
     AND   A.AGENT_STATE = '2'      
     AND   A.ir_code = '202'        
    
     UNION ALL       
    
     SELECT count(A.seqno) AS cnt    
     ,'회의' AS cnt_name     
     ,'17' AS ord      
     FROM TBL_AGENT_STATUS A     
  ,(SELECT empno, MAX(seqno) seqno 
    FROM TBL_AGENT_STATUS       
    GROUP BY empno          
  ) B ,TBL_AGENT C         
  WHERE A.seqno = B.seqno       
  AND A.empno = C.empno       
  AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')       
  AND C.duty_cd = '10'       
     AND   A.AGENT_STATE = '2'      
     AND   A.ir_code = '203'       
    
     UNION ALL       
    
     SELECT count(A.seqno) AS cnt    
     ,'식사' AS cnt_name     
     ,'18' AS ord      
     FROM TBL_AGENT_STATUS A     
  ,(SELECT empno, MAX(seqno) seqno 
    FROM TBL_AGENT_STATUS       
    GROUP BY empno          
  ) B ,TBL_AGENT C         
  WHERE A.seqno = B.seqno       
  AND A.empno = C.empno       
  AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')       
  AND C.duty_cd = '10'       
     AND   A.AGENT_STATE = '2'      
     AND   A.ir_code = '204'
          
     UNION ALL   
         
     SELECT count(A.seqno) AS cnt    
     ,'면담' AS cnt_name     
     ,'19' AS ord      
     FROM TBL_AGENT_STATUS A     
  ,(SELECT empno, MAX(seqno) seqno 
    FROM TBL_AGENT_STATUS       
    GROUP BY empno          
  ) B ,TBL_AGENT C         
  WHERE A.seqno = B.seqno       
  AND A.empno = C.empno       
  AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')       
  AND C.duty_cd = '10'       
     AND   A.AGENT_STATE = '2'      
     AND   A.ir_code = '205'      
    
     UNION ALL       
    
     SELECT count(A.seqno) AS cnt    
     ,'업무' AS cnt_name     
     ,'20' AS ord      
     FROM TBL_AGENT_STATUS A     
  ,(SELECT empno, MAX(seqno) seqno 
    FROM TBL_AGENT_STATUS       
    GROUP BY empno          
  ) B, TBL_AGENT C         
  WHERE A.seqno = B.seqno       
  AND A.empno = C.empno       
  AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')       
  AND C.duty_cd = '10'       
     AND   A.AGENT_STATE = '2'      
     AND   A.ir_code = '206'      
    
     UNION ALL       
    
     SELECT count(A.seqno) AS cnt    
     ,'지원' AS cnt_name     
     ,'21' AS ord      
     FROM TBL_AGENT_STATUS A     
  ,(SELECT empno, MAX(seqno) seqno 
    FROM TBL_AGENT_STATUS       
    GROUP BY empno          
  ) B            
     ,TBL_AGENT C         
  WHERE A.seqno = B.seqno       
  AND A.empno = C.empno       
  AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')       
  AND C.duty_cd = '10'       
     AND   A.AGENT_STATE = '2'      
     AND   A.ir_code = '207'
          
     UNION ALL 
           
     SELECT count(A.seqno) AS cnt    
     ,'기타' AS cnt_name     
     ,'22' AS ord      
     FROM TBL_AGENT_STATUS A     
  ,(SELECT empno, MAX(seqno) seqno 
    FROM TBL_AGENT_STATUS       
    GROUP BY empno          
  ) B ,TBL_AGENT C         
  WHERE A.seqno = B.seqno       
  AND A.empno = C.empno       
  AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')       
  AND C.duty_cd = '10'       
  AND   A.AGENT_STATE = '2'      
  AND   A.ir_code = '208'      
 ) A ORDER BY A.ord

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

이렇게 하면 가능하지 않을까 모르겠네요..

쿼리를 실행해 볼 수가 없는 상황이라 생각만으로 만들어 봤습니다..

 

SELECT COUNT(SEQNO ) AS cnt
     , MAX(cnt_name) AS cnt_name
     , ord           AS ord
  FROM (
         SELECT A.SENO
              , CASE WHEN A.AGENT_STATE NOT IN ('1', '9')                                  THEN '로그인'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '0'            THEN '준비중'
                     WHEN A.AGENT_STATE = '4'                                              THEN '통화중'
                     WHEN A.AGENT_STATE IN ('2', '5', '6') AND A.IR_CODE  = '211'          THEN '작업'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE IN ('209', '210') THEN '대기'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '201'          THEN '휴식'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '202'          THEN '교육'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '203'          THEN '회의'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '204'          THEN '식사'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '205'          THEN '면담'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '206'          THEN '업무'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '207'          THEN '지원'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '208'          THEN '기타'
                END AS cnt_name
              , CASE WHEN A.AGENT_STATE NOT IN ('1', '9')                                  THEN '10'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '0'            THEN '11'
                     WHEN A.AGENT_STATE = '4'                                              THEN '12'
                     WHEN A.AGENT_STATE IN ('2', '5', '6') AND A.IR_CODE  = '211'          THEN '13'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE IN ('209', '210') THEN '14'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '201'          THEN '15'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '202'          THEN '16'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '203'          THEN '17'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '204'          THEN '18'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '205'          THEN '19'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '206'          THEN '20'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '207'          THEN '21'
                     WHEN A.AGENT_STATE = '2'              AND A.IR_CODE  = '208'          THEN '22'
                END AS ord
           FROM TBL_AGENT_STATUS A
              , (
                  SELECT empno
                       , MAX(seqno) seqno
                    FROM TBL_AGENT_STATUS
                   GROUP BY empno
                ) B
              , TBL_AGENT C
          WHERE A.seqno    = B.seqno
            AND A.empno    = C.empno
            AND A.reg_date = TO_CHAR(SYSDATE,'YYYYMMDD')
            AND C.duty_cd  = '10'
     )
 WHERE ORD IS NOT NULL
 GROUP BY ord
 ORDER BY 3

知音(sunnylee72)님이 2011-05-06 16:03에 작성한 댓글입니다.
이 댓글은 2011-05-06 16:03에 마지막으로 수정되었습니다.

知音 님의 답글이 좋긴 한데요. 약간의 보정이 필요할 듯 합니다.
로그인에 해당하는 조건이 나머지 조건과 겹치는 부분이 발생하네요.
만약 나머지 조건들을 모두 합친 값이 로그인이라면?
NOT IN ('1', '9') 조건은 Where 절에서 부터 걸러낸 뒤
ROLLUP 을 이용해 로그입 합계를 구하시는게 좋겠습니다.


저는 다른 방법으로 접근해 보겠습니다.
WITH code_t AS
(
SELECT 10 ord, '로그인' cnt_name FROM dual
UNION ALL SELECT 11, '준비중' FROM dual
UNION ALL SELECT 12, '통화중' FROM dual
UNION ALL SELECT 13, '작업'   FROM dual
UNION ALL SELECT 14, '대기'   FROM dual
UNION ALL SELECT 15, '휴식'   FROM dual
UNION ALL SELECT 16, '교육'   FROM dual
UNION ALL SELECT 17, '회의'   FROM dual
UNION ALL SELECT 18, '식사'   FROM dual
UNION ALL SELECT 19, '면담'   FROM dual
UNION ALL SELECT 20, '업무'   FROM dual
UNION ALL SELECT 21, '지원'   FROM dual
UNION ALL SELECT 22, '기타'   FROM dual
)
, data_t AS
(
SELECT a.empno
     , a.agent_state x
     , a.ir_code     y
  FROM tbl_agent_status a
     , (SELECT empno
             , MAX(seqno) seqno
          FROM tbl_agent_status
         GROUP BY empno
        ) b
     , tbl_agent c
 WHERE a.seqno = b.seqno
   AND a.empno = c.empno
   AND a.reg_date = TO_CHAR(sysdate, 'yyyymmdd')
   AND c.duty_cd = '10'
)
SELECT DECODE(c.ord
     , 10, COUNT(CASE WHEN x NOT IN ('1', '9')                THEN 1 END)
     , 11, COUNT(CASE WHEN x = '2' AND y = '0'                THEN 1 END)
     , 12, COUNT(CASE WHEN x = '4'                            THEN 1 END)
     , 13, COUNT(CASE WHEN x IN ('2', '5', '6') AND y = '211' THEN 1 END)
     , 14, COUNT(CASE WHEN x = '2' AND y IN ('209', '210')    THEN 1 END)
     , 15, COUNT(CASE WHEN x = '2' AND y = '201'              THEN 1 END)
     , 16, COUNT(CASE WHEN x = '2' AND y = '202'              THEN 1 END)
     , 17, COUNT(CASE WHEN x = '2' AND y = '203'              THEN 1 END)
     , 18, COUNT(CASE WHEN x = '2' AND y = '204'              THEN 1 END)
     , 19, COUNT(CASE WHEN x = '2' AND y = '205'              THEN 1 END)
     , 20, COUNT(CASE WHEN x = '2' AND y = '206'              THEN 1 END)
     , 21, COUNT(CASE WHEN x = '2' AND y = '207'              THEN 1 END)
     , 22, COUNT(CASE WHEN x = '2' AND y = '208'              THEN 1 END)
     ) AS cnt
     , c.cnt_name
     , c.ord
  FROM code_t c
     , data_t d
 GROUP BY c.ord, c.cnt_name
 ORDER BY c.ord
;

마농(manon94)님이 2011-05-06 17:03에 작성한 댓글입니다.

좋은 가르침 주셔서 정말 감사합니다.

정말 많은 도움이 되었습니다!!

이재호(e1lineside)님이 2011-05-06 17:17에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
38546rman backup 옵션? [1]
이재영
2011-05-09
3285
38545ERWIN r7.3 에서 기존에 만든 ERD에 새로운 DB objects만 받을 수 있을까요? [1]
초보
2011-05-09
3592
38544분할 배분 하는 쿼리 질문입니다. [3]
무심도
2011-05-06
5294
38543속도때문에 union을 빼고 싶은데 잘안되네요... 방법이 없을까요? [3]
이재호
2011-05-06
4674
38542파티션 테이블 TRUNCATE 후 INSERT시 에러 [3]
김진국
2011-05-06
5940
38541트리거 3초에 200-300회 작동시 DB 과부하가 일어날까요? [2]
이민수
2011-05-06
5229
38540문자열이 포함되어 있는 컬럼에 데이터형 셀렉트 질문입니다... [3]
박경배
2011-05-06
3993
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다