쿼리 줄여주세요 0 15 2,018

by 우리집아찌 [2013.06.12 11:05:56]


월별 데이터 뽑아야해서 DECODE문에 넣으려니 길어지네요 짧게 구현할수있을까요?
 
SELECT TO_CHAR(ADD_MONTHS(TO_DATE('201301','YYYYMM'),1),'YYYYMM')
FROM DUAL
by 부쉬맨 [2013.06.12 11:18:03]
의도가 이쿼리는 조건으로 쓸려고하시는건가요??
그래서 월별로 존재해야되는지?? 현재기준으로 월별이아니라면
굳히 날짜함수를 쓰는이유는??
명확한 의도가있어야될뜻..

by 우리집아찌 [2013.06.12 11:21:06]

기준일으로 +1 개월 +2개월  데이타 뽑아야하는데  쿼리짜다보니 가독성도 떨어지는듯해서

다른분들은 좀 스마트하게 쓰시는게 없나해서요..

by 아발란체 [2013.06.12 11:23:00]
없을 것 같은데ㅋ

차이 없지만 다른 방법으로 TO_DATE를 CONCAT 연산으로.
SELECT TO_CHAR(ADD_MONTHS('201301'||'01', 1), 'YYYYMM') FROM DUAL


아님 FUNCTION으로... ㄱㄱㄱ ~

by 우리집아찌 [2013.06.12 11:28:00]

TO_DATE로 형식 안바꿔도 문제 없나요?


by 우리집아찌 [2013.06.12 11:23:04]
쿼리입니다.
 
 SELECT  1 class1 , 1 class2
     ,MAX(DECODE( DOC_YM ,'201301' , TOTAL_CNT )) || ' ea'
     ,MAX(DECODE( DOC_YM ,TO_CHAR(ADD_MONTHS(TO_DATE('201301','YYYYMM'),1),'YYYYMM') , TOTAL_CNT )) || ' ea'
     ,MAX(DECODE( DOC_YM ,TO_CHAR(ADD_MONTHS(TO_DATE('201301','YYYYMM'),2),'YYYYMM') , TOTAL_CNT )) || ' ea'   
 FROM ACCT_SUM
 UNION ALL
 SELECT  2 class1 , 1 class2
     ,MAX(DECODE( DOC_YM ,'201301' , DECODE(TOTAL_CNT,NULL,0, ROUND(NORMAL_CNT / TOTAL_CNT * 100 )))) || ' %'
     ,MAX(DECODE( DOC_YM ,TO_CHAR(ADD_MONTHS(TO_DATE('201301','YYYYMM'),1),'YYYYMM'),DECODE(TOTAL_CNT,NULL,0, ROUND(NORMAL_CNT / TOTAL_CNT * 100 )))) || ' %'
     ,MAX(DECODE( DOC_YM ,TO_CHAR(ADD_MONTHS(TO_DATE('201301','YYYYMM'),2),'YYYYMM'),DECODE(TOTAL_CNT,NULL,0, ROUND(NORMAL_CNT / TOTAL_CNT * 100 )))) || ' %'  
 FROM ACCT_SUM 

by 아발란체 [2013.06.12 11:26:28]
201301 값이 박혔는데 다른 값도 그냥 201302, 201303 쓰면 안되나요? ㅋㅅㅋ)ㆀ

by 우리집아찌 [2013.06.12 11:29:30]

그렇게 해도 되긴한데요 ..  스~마트한 먼가가 나올것같은 기대감이 있어서 올려봤습니다.


by 용근님 [2013.06.12 11:33:00]

그냥해요 ㅋ  

by 용근님 [2013.06.12 11:33:36]
TO_CHAR(ADD_MONTHS(TO_DATE('201301','YYYYMM'),1),'YYYYMM') 요걸 select 로 한번 더 감싸셔서 하시던지 ㅎㅎ

by 우리집아찌 [2013.06.12 11:38:47]

안되면 그렇게 해야죠 ㅎㅎㅎ


by 아발란체 [2013.06.12 11:33:06]
WITH T(D1, D2, D4) AS (
 SELECT
 '201301',
 TO_CHAR(ADD_MONTHS(TO_DATE('201301','YYYYMM'), 1), 'YYYYMM'),
 TO_CHAR(ADD_MONTHS(TO_DATE('201301','YYYYMM'), 1), 'YYYYMM')
 FROM
 DUAL
)
SELECT 1 class1 , 1 class2 
 ,MAX(DECODE( DOC_YM ,D1 , TOTAL_CNT )) || ' ea'
 ,MAX(DECODE( DOC_YM ,D2 , TOTAL_CNT )) || ' ea'
 ,MAX(DECODE( DOC_YM ,D3 , TOTAL_CNT )) || ' ea' 
FROM ACCT_SUM, T
UNION ALL
SELECT 2 class1 , 1 class2 
 ,MAX(DECODE( DOC_YM ,D1,DECODE(TOTAL_CNT,NULL,0, ROUND(NORMAL_CNT / TOTAL_CNT * 100 )))) || ' %'
 ,MAX(DECODE( DOC_YM ,D2,DECODE(TOTAL_CNT,NULL,0, ROUND(NORMAL_CNT / TOTAL_CNT * 100 )))) || ' %'
 ,MAX(DECODE( DOC_YM ,D3,DECODE(TOTAL_CNT,NULL,0, ROUND(NORMAL_CNT / TOTAL_CNT * 100 )))) || ' %' 
FROM ACCT_SUM, T

--안스마트, 후다닥 ==3==3

by 우리집아찌 [2013.06.12 11:37:49]
저도 요렇게 할까생각했다가.. 혹시나 해서 올려봣어요..

UNION ALL 24개 더해야하는데.. 넘 지저분해서요.. ㅋㅋ

by 마농 [2013.06.12 13:44:43]
24개 Union 쿼리 다 올려 주세요.

by 마농 [2013.06.12 14:02:28]
SELECT class1, class2
     , MIN(DECODE(m, 0, v)) v1
     , MIN(DECODE(m, 1, v)) v2
     , MIN(DECODE(m, 2, v)) v3
  FROM (
        SELECT class1, class2
             , MONTHS_BETWEEN(TO_DATE(doc_ym, 'yyyymm'), TO_DATE(:v_ym, 'yyyymm')) m
             -- 24개 기준별 계산공식 나열
             , DECODE(class1 || '-' || class2
             , '1-1', total_cnt || ' ea'
             , '2-1', NVL(ROUND(normal_cnt / total_cnt * 100), 0) || ' %'
             ) v
          FROM acct_sum
             , (-- 24개 기준 --
                SELECT 1 class1, 1 class2 FROM dual
                UNION ALL SELECT 2, 1 FROM dual
                )
         WHERE doc_ym >= :v_ym
           AND doc_ym <= TO_CHAR(ADD_MONTHS(TO_DATE(:v_ym, 'yyyymm'), 2), 'yyyymm')
        )
 GROUP BY class1, class2
 ORDER BY class1, class2
;

by 우리집아찌 [2013.06.14 11:42:13]
늦게 봤네요..
감사합니다. 덕분에 엄청 수월하게 값이 나오네요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입