조회 쿼리 그룹 관련하여 질문드립니다. 0 4 2,229

by 김태민 [SQL Query] 조회 SQL GROUP BY [2018.06.19 15:49:59]


안녕하세요.

SQL 매우매우 초보입니다... 찾아봐도 잘모르겠어서 죄송한 마음으로 질문 올립니다.

아래 형태의 소스를 받았는데 속도가 너무 느려서 쿼리를 수정할 필요가 있습니다.

SELECT 
       (SELECT IFNULL(SUM(IFNULL(AD1_RQ,0)),0) 
         FROM TV_SUPPORT_SUB 
        WHERE SPRT_IDX IN 
              (SELECT SPRT_IDX 
                FROM TV_SUPPORT_MASTER 
               WHERE COMP_USER_KEY = A.USER_KEY 
                     AND SPRT_TYPE = 'AD' 
                     AND SPRT_STATUS = 'AD3' 
              ) 
       ) RQ1 
  FROM TV_USER A 
 WHERE USER_TYPE IN ('P') 
ORDER BY RQ1 DESC;

 

제가 나름 그룹해본다고 아래같이 수정했습니다.

SELECT IFNULL(SUM(IFNULL(SS.AD1_RQ,0)),0) RQ1 
  FROM TV_USER A, 
       TV_SUPPORT_SUB SS, 
       TV_SUPPORT_MASTER SM 
 WHERE USER_TYPE IN ('P') 
       AND SM.COMP_USER_KEY = A.USER_KEY 
       AND SM.SPRT_TYPE = 'AD' 
       AND SM.SPRT_STATUS = 'AD3' 
   GROUP BY SM.SPRT_IDX 
ORDER BY RQ1 DESC;

 

역시나 정상적으로 동작하지 않습니다.

어떤식으로 쿼리를 수정해야할까요...? ㅠ

by 마농 [2018.06.19 16:30:57]

1. 일단 조인 조건 하나가 누락되었네요.(SM.SPRT_IDX = SS.SM.SPRT_IDX)
2. Group By 기준도 잘못 잡으신 듯 하네요.
3. 서브쿼리를 조인으로 바꾸려면 테이블간의 관계를 정확하게 파악해야 합니다.
각 테이블의 키가 어떻게 되나요?


by 김태민 [2018.06.19 17:12:13]

TV_USER : 회원(기업) 정보 테이블

CREATE TABLE `tv_user` (
  `USER_KEY` int(11) NOT NULL AUTO_INCREMENT COMMENT '회원기본키',
  `USER_ID` varchar(255) NOT NULL COMMENT '아이디',
  `USER_PWD` varchar(255) NOT NULL COMMENT '비밀번호',
  `COMP_YEAR` varchar(255) DEFAULT NULL COMMENT '업체년도',
  
  ...
  
  PRIMARY KEY (`USER_KEY`)
) ENGINE=MyISAM AUTO_INCREMENT=739 DEFAULT CHARSET=utf8 COMMENT='회원기본정보테이블';

 

TV_SUPPORT_MASTER : 지원관리 마스터 테이블, USER_KEY를 외래키로 여러개의 지원관리데이터를 생성합니다.

CREATE TABLE `tv_support_master` (
  `SPRT_IDX` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '지원관리번호',
  `SPRT_TYPE` varchar(255) NOT NULL COMMENT '지원구분 (정산:AD,사업화지원:BS,성과:RS,컨설팅조회:CT,컨설팅보고서:CR)',
  `SPRT_SUB_TYPE` varchar(255) DEFAULT NULL COMMENT '지원상세구분',
  `SPRT_STATUS` varchar(255) DEFAULT NULL COMMENT '지원상태',
  `COMP_USER_KEY` varchar(255) DEFAULT NULL COMMENT '업체키',

	...

  PRIMARY KEY (`SPRT_IDX`)
) ENGINE=MyISAM AUTO_INCREMENT=7600 DEFAULT CHARSET=utf8 COMMENT='지원관리 마스터 테이블';

 

 

TV_SUPPORT_SUB : 지원관리 서브 테이블, SPRT_IDX를 외래키로 여러개의 지원관리 상세정보데이터를 생성합니다.

CREATE TABLE `tv_support_sub` (
  `SPRT_IDX` int(11) NOT NULL COMMENT '지원관리번호',
  `AD1_RQ` int(11) DEFAULT NULL,
  
  ...
  
  PRIMARY KEY (`SPRT_IDX`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='성과등록서브정보테이블';

 

결국 이 쿼리가 하고싶은 작업은 "사용자별 AD1_RQ의 총합" 입니다. 

그래서 TV_SUPPORT_MASTER에서 TV_USER의 USER_KEY값과 TV_SUPPORT_MASTER의 COMP_USER_KEY값과 같은 데이터의 SPRT_IDX를 뽑은 후, 

TV_SUPPORT_SUB에서 SPRT_IDX값이 포함되는 열의 AD1_RQ를 SUM하는 흐름입니다.

 

코드로는 어떻게 해야할지 모르겠습니다ㅠㅠㅠ


by 마농 [2018.06.19 17:41:31]
SELECT a.user_key
     , IFNULL(SUM(ss.ad1_rq), 0) rq1
  FROM tv_user a
  LEFT OUTER JOIN tv_support_master sm
    ON sm.comp_user_key = a.user_key
   AND sm.sprt_type     = 'AD'
   AND sm.sprt_status   = 'AD3'
  LEFT OUTER JOIN tv_support_sub ss
    ON sm.sprt_idx = ss.sprt_idx
 WHERE a.user_type IN ('P')
 GROUP BY a.user_key
 ORDER BY rq1 DESC
;

 


by 김태민 [2018.06.19 18:26:17]

너무너무 감사합니다! 

천천히 다시 읽으면서 답변주신 내용 공부하겠습니다.

감사합니다!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입