mysql 쿼리 질문드립니다. 0 2 855

by 밍밍밍밍 [MySQL] [2019.01.28 15:55:01]


20190128_155106.png (3,321Bytes)

SELECT
	      	TSR.USE_DB_GUBUN
	       ,COUNT(CASE WHEN DATE_FORMAT(TSR.REG_DATE, '%Y-%m') = '2019-01' THEN TSR.SEQ END) tot1
          ,COUNT(CASE WHEN DATE_FORMAT(TSR.REG_DATE, '%Y-%m') = '2019-02' THEN TSR.SEQ END) tot2
          ,COUNT(CASE WHEN DATE_FORMAT(TSR.REG_DATE, '%Y') = '2019' THEN TSR.SEQ END) totSum
			FROM support TS 
	    LEFT OUTER JOIN support_req TSR
	    ON TS.seq = TSR.sup_idx
      WHERE TS.GUBUN IN ('11')
      AND TS.USE_YN = 'Y'

      
      GROUP BY TSR.USE_DB_GUBUN
   		  ORDER BY USE_DB_GUBUN

 

위 쿼리를 조회하면 첨부파일의 결과가 나옵니다.

USE_DB_GUBUN은 체크박스 value값인데 중복선택시 @로 구분됩니다.

중복선택인 값은 나눠서 해당컬럼에 더해서 조회를 하고싶은데 첨부파일의 표를 아래 표처럼 조회하고싶습니다..

이렇게 쿼리를 짤수있을까요?

USE_DB_GUBUN tot1 tot2 totSum
01 6 0 6
02 8 0 8
03 5 0 5

 

by 마농 [2019.01.28 17:10:04]

1. 아우터 조인 필요한가?
  - 집계 기준항목이 tsr 의 항목인데요?
  - tsr 을 아우터 조인 하는게 의미가 있나요?
2. COUNT(tsr.seq) 가 의미가 있나요?
  - tsr.seq 항목이 널 가능 항목인가요?
  - 그냥 COUNT(1) 하면 될 것 같습니다.
  - 변경전 , COUNT(CASE WHEN DATE_FORMAT(tsr.reg_date, '%Y-%m') = '2019-01' THEN tsr.seq END) tot1
  - 변경후 , COUNT(CASE WHEN DATE_FORMAT(tsr.reg_date, '%Y-%m') = '2019-01' THEN 1 END) tot1
3. Case 의 조건중에
  - 연도 조건은 조건절에서 미리 거르는게 좋을 듯 합니다.
4. 원하시는 결과물은
  - 코드테이블을 만들어 조인하시면 될 듯 하네요.

SELECT b.use_db_gubun
     , SUM(tot1) tot1
     , SUM(tot2) tot2
     , SUM(totsum) totsum
  FROM (SELECT tsr.use_db_gubun
             , COUNT(CASE WHEN DATE_FORMAT(tsr.reg_date, '%m') = '01' THEN 1 END) tot1
             , COUNT(CASE WHEN DATE_FORMAT(tsr.reg_date, '%m') = '02' THEN 1 END) tot2
             , COUNT(*) totSum                    -- 2. Count 에 컬럼명 제거
          FROM support ts
         INNER JOIN support_req tsr               -- 1. 이너조인으로 변경
            ON ts.seq = tsr.sup_idx
         WHERE ts.gubun IN ('11')
           AND ts.use_yn = 'Y'
           AND tsr.reg_date >= '2019-01-01'       -- 3. 연도조건을 아래로
           AND tsr.reg_date <  '2020-01-01'
         GROUP BY tsr.use_db_gubun
        ) a
 INNER JOIN
       (SELECT '01' use_db_gubun
        UNION ALL SELECT '02'
        UNION ALL SELECT '03'
        ) b
    ON INSTR(a.use_db_gubun, b.use_db_gubun) > 0  -- 4. 코드 테이블과 조인
 GROUP BY b.use_db_gubun
 ORDER BY b.use_db_gubun
;

 


by 밍밍밍밍 [2019.01.28 17:20:39]

답변감사드립니다!

설명해주신 내용 참고하겠습니다!

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