증감률 다시 질문드립니다. 0 5 1,923

by 몽키매직 [Oracle 기초] [2017.11.02 16:25:14]


어찌하여 쿼리는 완성하였는데 효율적인 방법이 또 있는지 다시 질문드리겠습니다..

with t as

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

 result row  :

개증감구분 개 증감율 고양이증감구분 고양이 증감율 증감률 높은거(ex 개 or 고양이) am 증감율 pm 증감율 증감율 높은거(ex 오전 or 오후)
+ + 30.3% - - 15.4% -83.2% + 104.2% 오후

결과 로우는 한줄로 저렇게 나오길 원합니다.

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

( 선택된 지역의 201611월 방문율과 201711월 방문율 데이터 비교하여 증감률 )

 

by 마농 [2017.11.02 16:43:12]

완성된 쿼리도 보고싶고
result 의 타이틀 뿐만 아니라 결과값도 함께 보고 싶네요.
그리고...
보여주신 with 문이 원본이 아닐것 같은 느낌이 오네요.
1차 가공 결과인 듯.
 - (원본 > 1차가공 > 최종결과) 하는 것 보다
 - (원본 > 최종결과) 로 바로 뽑는것이 오히려 더 쉬운 경우도 있습니다.


by 몽키매직 [2017.11.02 16:56:41]

예상 결과값도 적어서 수정했습니다 .^^;

with 문은 원본 데이터입니다. 1차 가공?은 다른곳에서 작업하여 with문과 같은 결과를 접근 가능한 테이블에 쌓습니다.

그리하여 이쪽에서 원본이라 볼수 있는 데이터입니다.

 

 


by 마농 [2017.11.02 17:14:45]
WITH t AS
( 
SELECT '201610' 년도, '123' 지역, 54 개방문, 65 고양이방문, 24 오전방문, 74 오후방문 FROM dual 
UNION ALL SELECT '201611', '123',  54,  65,  24,  74 FROM dual 
UNION ALL SELECT '201611', '234',  23,  13,  53,  34 FROM dual 
UNION ALL SELECT '201611', '534',  53,   6,   3,   5 FROM dual 
UNION ALL SELECT '201611', '234',  12,   3, 123,  35 FROM dual 
UNION ALL SELECT '201611', '153',  53,  74,  52,  63 FROM dual 
UNION ALL SELECT '201701', '234', 123,  14,  96,  34 FROM dual 
UNION ALL SELECT '201702', '125', 634,   4,  45,  63 FROM dual 
UNION ALL SELECT '201703', '125',  12, 104,  35,  35 FROM dual 
UNION ALL SELECT '201703', '125',  93,  23,  75,  63 FROM dual 
UNION ALL SELECT '201709', '123', 231,  53,  12,  63 FROM dual 
UNION ALL SELECT '201709', '125', 321,   1,  64,  73 FROM dual 
UNION ALL SELECT '201711', '153',  85,  53,  34,  12 FROM dual 
UNION ALL SELECT '201711', '123',  32,  74,  63, 123 FROM dual 
UNION ALL SELECT '201711', '234',  75,  85, 112, 163 FROM dual 
UNION ALL SELECT '201711', '008',  53,   4,   3,  26 FROM dual 
)
SELECT DECODE(SIGN(개2-개1), 1, '+', -1, '-', 0, '0', 'new') 개증감구분
     , ROUND((개2-개1)/개1*100, 2) 개증감
     , DECODE(SIGN(냥2-냥1), 1, '+', -1, '-', 0, '0', 'new') 냥증감구분
     , ROUND((냥2-냥1)/냥1*100, 2) 냥증감
     , CASE WHEN (개2-개1)/개1 > (냥2-냥1)/냥1 THEN '개'
            WHEN (개2-개1)/개1 < (냥2-냥1)/냥1 THEN '냥'
            WHEN (개2-개1)/개1 = (냥2-냥1)/냥1 THEN '개냥_동률'
        END 증감높은거_개냥
     , ROUND((am2-am1)/am1*100, 2) am증감
     , ROUND((pm2-pm1)/pm1*100, 2) pm증감
     , CASE WHEN (am2-am1)/am1 > (pm2-pm1)/pm1 THEN 'AM'
            WHEN (am2-am1)/am1 < (pm2-pm1)/pm1 THEN 'PM'
            WHEN (am2-am1)/am1 = (pm2-pm1)/pm1 THEN 'AM_PM_동률'
        END 증감높은거_AM_PM
  FROM (SELECT SUM(DECODE(년도, :v_ym, null, 개방문   )) 개1
             , SUM(DECODE(년도, :v_ym,       개방문, 0)) 개2
             , SUM(DECODE(년도, :v_ym, null, 고양이방문   )) 냥1
             , SUM(DECODE(년도, :v_ym,       고양이방문, 0)) 냥2
             , SUM(DECODE(년도, :v_ym, null, 오전방문   )) am1
             , SUM(DECODE(년도, :v_ym,       오전방문, 0)) am2
             , SUM(DECODE(년도, :v_ym, null, 오후방문   )) pm1
             , SUM(DECODE(년도, :v_ym,       오후방문, 0)) pm2
          FROM t
         WHERE 지역 IN (:v1, :v2, :v3)               -- ('153', '234', '123')
           AND 년도 IN (:v_ym, TO_CHAR(:v_ym - 100)) -- ('201711')
        )
;

 


by 몽키매직 [2017.11.03 09:30:58]

마농님 감사합니다.

짜주신걸 보니 굳이 년월을 그룹바이로 묶을 필요가 없었군요.. ㅎㅎ LAG.() over ... 도 굳이 쓸필요가 없었군..

크..괜히 복잡하게 생각했네.. 감사합니다.

아..혹시 개.고양이 두개가 아니라 오리, 돼지 .. 등등의 다수일 경우에 높은거 고를때는 GREATEST 쓰는게 나을까요?

동률일때가 문제이긴한데.. 소수점까지 비교하면 동률은 없다고 봐야하려나 ;;

 


by 마농 [2017.11.06 09:11:34]

결과를 한줄로 쭈욱 나열하는것이 과연 좋은 report 인지 생각해 봐야 합니다.
구분값에 따라 적절하게 좌우 행열로 배치하는게 보기 좋을 것입니다.
예를 들면
1 열은 개냥과 오전오후 를 구분하는 구분값1(애완동물/시간)
2 열은 1열의 구분에 따라 개/냥 인지? 오전/오후 인지를 나타내는 구분값2
3 열은 전년도 값
4 열은 당년도 값
5 열은 증감율
등등 ...
구분값1 에 따른 순위를 표시하는 열을 추가한다면 더 좋은 결과물이 될 듯 합니다.

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