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 |
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 ;