저번에 도움받았는데 한단계 업그레이드하여 도움 부탁드립니다. 0 2 1,349

by 몽키매직 [SQL Query] [2017.11.08 14:20:25]


이전에 질문하여 얇은 지식이 한까풀 도움이 됐습니다 ㅎㅎ. 염치없지만 다시 질문 좀 드리겠습니다.

with t as

  select '201605' as 년도, '123' as 지역, 54 as 개방문, 65 as 고양이방문, 24 as 오전1, 63 as 오전2, 74 as 오후1, 23 as 오후2 from dual union all
select '201605', '008', 4, 5, 4, 14, 44, 24 from dual union all
select '201611', '123', 54, 65, 24, 24, 74, 54 from dual union all
select '201611', '234', 23, 13, 53, 13, 34, 64 from  dual union all
select '201611', '534', 53, 6, 3, 53, 5, 75 from dual union all
select '201611', '234', 12, 3, 123, 13, 35, 95 from dual union all
select '201611', '153', 53, 74, 52, 82, 63, 96 from dual union all
select '201701', '234', 123, 14, 96, 53 , 34, 21 from dual union all
select '201702', '125', 634, 4, 45, 5, 63, 85 from dual union all
select '201705', '125', 12, 104, 35, 64, 35, 93 from dual union all
select '201705', '234', 93, 23, 75, 14, 63, 104 from dual union all
select '201705', '123', 231, 53, 12, 53, 63, 105 from dual union all
select '201709', '125', 321, 1, 64, 85, 73, 14 from dual union all
select '201711', '153', 85, 53, 34, 57, 12, 43 from dual union all
select '201711', '123', 32, 74, 63, 13, 123, 0 from dual union all
select '201711', '234', 75, 85, 112, 43, 163, 53 from dual union all
select '201711', '008', 53, 4, 3, 53, 26, 3 from dual
)

 result :

  2016.05 2016.11 2017.5 2017.11 증감 비고
전체건수 834 534 634 343 +83.2% +24.2%
53 34 42 132 -23.3% 고양이
고양이 12 64 23 75 +0.4%
오전1 3 0 13 53 -17.4% 오전2
오전2 14 64 12 5 +83.2%
오후1 64 23 13 75 +3.3%
오후2 23 53 105 163 +75.4%

웹상에 table에 저렇게 뿌려줄겁니다.

반목문을 안써도 될것 같아서 굳이 저런 형식의 결과 row가 안나와도 될것같긴 합니다.

현재는 쿼리를 두개로 나눠서 (각 방문카운트, 증감[이전에 짜놓은것]) 이렇게 결과물을 얻고 웹상에서 하나하나 더해서

전체건수 카운트를 하고있습니다.  지금도 계속 고민고민 해보고있긴 합니다만 한방에 나올수가 있을까요?

조건은 선택된 지역, 작년 동월 대비 방문횟수 증감률입니다. (ex. 지역 in ( '153', '234', '153') )

( 현재 201711월 기준으로 선택된 지역의 201611월 방문율과 201711월 방문율 데이터 비교하여 증감률및 증감률 높은

거..  그 이외의 -6개월, -18개월 의 데이터는 단순 방문 카운트.. 전체건수는 해당년월의 전체 카운트입니다. )

어느정도 접근했다 싶으면 저..전체건수때문에 또 안되고.. 그러네요 ㅠㅠ 

컬럼이 이 외에도 요일도 있어서 가로로 나열하려면 전부 select 절에 써줘야 하겠죠?

 

by 마농 [2017.11.08 20:10:45]
WITH t AS
( 
SELECT '201605' 년도, '123' 지역, 54 개방문, 65 고양이방문, 24 오전1, 63 오전2, 74 오후1, 23 오후2 FROM dual
UNION ALL SELECT '201605', '008',   4,   5,   4, 14,  44,  24 FROM dual
UNION ALL SELECT '201611', '123',  54,  65,  24, 24,  74,  54 FROM dual
UNION ALL SELECT '201611', '234',  23,  13,  53, 13,  34,  64 FROM dual
UNION ALL SELECT '201611', '534',  53,   6,   3, 53,   5,  75 FROM dual
UNION ALL SELECT '201611', '234',  12,   3, 123, 13,  35,  95 FROM dual
UNION ALL SELECT '201611', '153',  53,  74,  52, 82,  63,  96 FROM dual
UNION ALL SELECT '201701', '234', 123,  14,  96, 53,  34,  21 FROM dual
UNION ALL SELECT '201702', '125', 634,   4,  45,  5,  63,  85 FROM dual
UNION ALL SELECT '201705', '125',  12, 104,  35, 64,  35,  93 FROM dual
UNION ALL SELECT '201705', '234',  93,  23,  75, 14,  63, 104 FROM dual
UNION ALL SELECT '201705', '123', 231,  53,  12, 53,  63, 105 FROM dual
UNION ALL SELECT '201709', '125', 321,   1,  64, 85,  73,  14 FROM dual
UNION ALL SELECT '201711', '153',  85,  53,  34, 57,  12,  43 FROM dual
UNION ALL SELECT '201711', '123',  32,  74,  63, 13, 123,   0 FROM dual
UNION ALL SELECT '201711', '234',  75,  85, 112, 43, 163,  53 FROM dual
UNION ALL SELECT '201711', '008',  53,   4,   3, 53,  26,   3 FROM dual
)
SELECT CASE WHEN gb IN ('개', '고양이') THEN '동물'
            WHEN gb IN ('오전1', '오전2', '오후1', '오후2') THEN '시간'
        END gb1
     , NVL(gb, '전체') gb2
     , m18, m12, m06, m00
     , ROUND((m00 - m12) / m12 * 100, 2) rat
  FROM (SELECT mm
             , gb
             , SUM(v) v
          FROM (SELECT DECODE(년도, ym1, 0, ym2, 6, ym3, 12, ym4, 18) mm
                     , 개방문 개, 고양이방문 고양이
                     , 오전1, 오전2, 오후1, 오후2
                  FROM t
                     , (-- 검색 조건 정의 --
                        SELECT TO_CHAR(ADD_MONTHS(ym,   0), 'yyyymm') ym1
                             , TO_CHAR(ADD_MONTHS(ym,  -6), 'yyyymm') ym2
                             , TO_CHAR(ADD_MONTHS(ym, -12), 'yyyymm') ym3
                             , TO_CHAR(ADD_MONTHS(ym, -18), 'yyyymm') ym4
                             , '153' v1
                             , '234' v2
                             , '123' v3
                          FROM (SELECT TO_DATE('201711', 'yyyymm') ym FROM dual)
                        )
                 WHERE 지역 IN (v1, v2, v3)
                   AND 년도 IN (ym1, ym2, ym3, ym4)
                )
         UNPIVOT (v FOR gb IN (개, 고양이, 오전1, 오전2, 오후1, 오후2))
         GROUP BY mm, ROLLUP(gb)
        )
 PIVOT (SUM(v) FOR mm IN (18 m18, 12 m12, 6 m06, 0 m00)) a
 ORDER BY a.gb NULLS FIRST
;

 


by 몽키매직 [2017.11.09 13:41:04]

오아.. 마농님 또 한번 감사합니다. 

이번에 도움주신 쿼리는 하나하나 뜯어봐야 겠네요.. 전 완전 피벗없이 쌩노가다로 짜서 ㅜㅜ..

혹시나.. 이걸 응용?해서 18개월까지 전부 다 나오게 하려면 pivot 에서 18, 12, 6, 0 이렇게 되어있는걸 0~18까지 다 적어

줘야 하겠죠?

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