통계 관련 쿼리 튜닝부탁드립니다..... ㅜㅜ 0 5 1,626

by 임핑구 [2015.09.09 11:17:49]


1. 문제의 쿼리

SELECT *
FROM
  (SELECT 'D', -----Daily
    RSLT ,
    COUNT(RSLT)
  FROM V_USER_STATS
  WHERE SU_USR_ID='2014106'
  AND SU_DT      = TO_CHAR(SYSDATE , 'yyyymmdd')
  GROUP BY RSLT
  UNION
  SELECT 'm', -----Monthly
    RSLT ,
    COUNT(RSLT)
  FROM V_USER_STATS
  WHERE SU_USR_ID='2014106'
  AND SU_DT LIKE TO_CHAR(SYSDATE , 'yyyymm')||'%'
  AND SU_DT <=TO_CHAR(SYSDATE , 'yyyymmdd')
  GROUP BY RSLT
  UNION
  SELECT 'y', -----Yearly
    RSLT ,
    COUNT(RSLT)
  FROM V_USER_STATS
  WHERE SU_USR_ID='2014106'
  AND SU_DT LIKE TO_CHAR(SYSDATE , 'yyyy')||'%'
  AND SU_DT <=TO_CHAR(SYSDATE , 'yyyymmdd')
  GROUP BY RSLT
  )

 

결과

.. rslt count(rslt)
d 2 1
m 1 3
m 2 3
m 3 2
y 1 21
y 2 5
y 3 24

 

 

2. 하고 싶은것...

Daily , monthly , yearly .. 결과값(rslt) 통계를 내고 싶음 ㅜㅜ

 

추가로 하고 싶은것..

결과값은 무조건 1,2,3, 세개 인데..

갯수가 없는 것도 0으로 출력하고 싶고 ㅜㅜ

 

Ex)

  rslt count(rslt)
d 1 0
d 2 1
d 3 0

 

 

 

3. 아무리 봐도 저 쿼리가 비효율적인거 같네요.ㅠㅠ

 

 

 

사실 .. 저 결과 테이블을 화면에 뿌려야 하는데... 어떻게 담아서 뿌려줘야 할지 모르겠어요ㅠㅠ

 

 

by 아발란체 [2015.09.09 13:30:58]

화면에 뿌린다는 것은 서비스를 한다는 것인데,

마스터 테이블을 집계 SQL로 수시 접근한다는 것은 장기적으로 좋을 것 같지 않습니다.

 

아무튼

기본 구문인 그룹바이 절을 이용하여 년, 월, 일별 집계를 접근하시면 될 것 같습니다.

 

일단 SQL 보면 1년 단위이기 때문에

1년치만 가지고 와서,

SUBSTR를 하시던, 항목 반정규화를 하시던 항목을, 년, 월, 일 3개로 분리하여 그룹바이하면 될 것 같습니다.

 

 


by 임핑구 [2015.09.09 13:48:14]

댓글 감사합니다..

제가 잉여로와 반정규화 등 ㅜㅜ 고급진 단어에 익숙치 않아 서툴지만..

 

현재 서비스가 통계적으로 계속 접근을 할수 밖에 없는 구조라 ㅜㅜ 피치 못하게 사용 해야 할것 같습니다.

 

전 시키는대로 하는 ㅜㅜ 흑


by 마농 [2015.09.09 13:38:14]
SELECT gb, rslt, cnt
  FROM (SELECT rslt
             , COUNT(DECODE(su_dt, TO_CHAR(sysdate, 'yyyymmdd'), 1)) d
             , COUNT(DECODE(SUBSTR(su_dt, 1, 6), TO_CHAR(sysdate, 'yyyymm'), 1)) m
             , COUNT(*) y
          FROM v_user_stats
         WHERE su_usr_id = '2014106'
           AND su_dt >= TO_CHAR(sysdate, 'yyyy')||'0101'
           AND su_dt <= TO_CHAR(sysdate, 'yyyymmdd')
         GROUP BY rslt
        )
 UNPIVOT (cnt FOR gb IN (d, m, y))
 ORDER BY gb, rslt
;

 


by 임핑구 [2015.09.09 13:45:36]

감사합니다.. 

UNPIVOT 을 사용할수 없어 쿼리 중간 코드만 가져다 써도 원하는 결과를 받을수 있을것 같습니다!

어차피 출력하는 페이지라 변수에 잘 담아서 뿌려만 주면 될것 같아요

감사합니다 진짜루 ㅠㅠ


by 마농 [2015.09.09 14:24:26]
SELECT gb
     , rslt
     , DECODE(gb, 'd', d, 'm', m, 'y', y) cnt
  FROM (SELECT rslt
             , COUNT(DECODE(su_dt, TO_CHAR(sysdate, 'yyyymmdd'), 1)) d
             , COUNT(DECODE(SUBSTR(su_dt, 1, 6), TO_CHAR(sysdate, 'yyyymm'), 1)) m
             , COUNT(*) y
          FROM v_user_stats
         WHERE su_usr_id = '2014106'
           AND su_dt >= TO_CHAR(sysdate, 'yyyy')||'0101'
           AND su_dt <= TO_CHAR(sysdate, 'yyyymmdd')
         GROUP BY rslt
        )
     , (SELECT 'd' gb FROM dual
        UNION ALL SELECT 'm' FROM dual
        UNION ALL SELECT 'y' FROM dual
        )
 ORDER BY gb, rslt
;

 

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