database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41648 게시물 읽기
No. 41648
출력되는 두 row 비교 문의드립니다.
작성자
k62511(k62511)
작성일
2018-10-31 11:28
조회수
3,558

 

 

select ACC_YMD, GUBUN, NUM_DATA

from (

select DATA_GBN, STD_YEAR||STD_MON as ACC_YMD,RTRIM(TO_CHAR(GD_SU/100000, 'FM99.00'),'.') as NUM_DATA, '서울평균' AS GUBUN, '01' as ord from tbl1

union

select DATA_GBN, STD_YEAR||STD_MON as ACC_YMD,RTRIM(TO_CHAR(GD_CDCT_DSTRCT/100000, 'FM99.00'),'.') AS NUM_DATA, '도심권' AS GUBUN, '02' as ord from tbl1

union

select DATA_GBN, STD_YEAR||STD_MON as ACC_YMD,RTRIM(TO_CHAR(GD_NE_DSTRCT/100000, 'FM99.00'),'.') as NUM_DATA, '동북권' AS GUBUN, '03' as ord from tbl1

union

select DATA_GBN, STD_YEAR||STD_MON as ACC_YMD,RTRIM(TO_CHAR(GD_NW_DSTRCT/100000, 'FM99.00'),'.') as NUM_DATA, '서북권' AS GUBUN, '04' as ord from tbl1

union

select DATA_GBN, STD_YEAR||STD_MON as ACC_YMD,RTRIM(TO_CHAR(GD_SW_DSTRCT/100000, 'FM99.00'),'.') as NUM_DATA, '서남권' AS GUBUN, '05' as ord from tbl1

union

select DATA_GBN, STD_YEAR||STD_MON as ACC_YMD,RTRIM(TO_CHAR(GD_SE_DSTRCT/100000, 'FM99.00'),'.') as NUM_DATA, '동남권' AS GUBUN, '06' as ord from tbl1

)

where DATA_GBN = 7

and ACC_YMD >= TO_CHAR(ADD_MONTHS(TO_DATE('201808','YYYYMM'),-1), 'YYYYMM')

and ACC_YMD <= '201808'

 

해당쿼리를 실행하면  

 

201807 서울평균 6.96

201808 서울평균 7.02

201807 도심권 8.99

201808 도심권 9.12

201807 동북권 4.55

201808 동북권 4.58

201807 서북권 5.66

201808 서북권 5.73

201807 서남권 5.55

201808 서남권 5.61

201807 동남권 11.69

201808    동남권     11.79

 

이러한 형태의 데이터가 나오게 되는데요

구분별로 2달치의 데이터가 출력이됩니다.

현재 출력되는 형태에 변동률을 추가하고 싶어서 문의드립니다..

각 권역 구분별로 변동률을 구하고 싶습니다..

컬럼 추가형식으로 아래와 같이 변동률을 구하고싶은데 조언부탁드립니다..

 

201807 서울평균 6.96  0.9

201808 서울평균 7.02  0.9

201807 도심권 8.99  1.4

201808 도심권 9.12  1.4

201807 동북권 4.55  0.7

201808 동북권 4.58  0.7

201807 서북권 5.66  1.2

201808 서북권 5.73  1.2

201807 서남권 5.55  1.1

201808 서남권 5.61  1.1

201807 동남권 11.69  0.9

201808    동남권     11.79  0.9

이 글에 대한 댓글이 총 6건 있습니다.

WITH T(YYYYMM, NM, VAL) AS ( 
SELECT '201807', '서울평균', 6.96 FROM DUAL UNION ALL
SELECT '201808', '서울평균', 7.02 FROM DUAL UNION ALL
SELECT '201807', '도심권', 8.99 FROM DUAL UNION ALL
SELECT '201808', '도심권', 9.12 FROM DUAL UNION ALL
SELECT '201807', '동북권', 4.55 FROM DUAL UNION ALL
SELECT '201808', '동북권', 4.58 FROM DUAL UNION ALL
SELECT '201807', '서북권', 5.66 FROM DUAL UNION ALL
SELECT '201808', '서북권', 5.73 FROM DUAL UNION ALL
SELECT '201807', '서남권', 5.55 FROM DUAL UNION ALL
SELECT '201808', '서남권', 5.61 FROM DUAL UNION ALL
SELECT '201807', '동남권', 11.69 FROM DUAL UNION ALL
SELECT '201808', '동남권', 11.79 FROM DUAL )
SELECT YYYYMM, NM, VAL
     , ROUND( ( MAX_VAL - MIN_VAL ) / MIN_VAL * 100, 1 ) AS TMP

  FROM ( SELECT YYYYMM, NM, VAL
              , MIN( VAL ) OVER ( PARTITION BY NM ORDER BY NM ) AS MIN_VAL
              , MAX( VAL ) OVER ( PARTITION BY NM ORDER BY NM ) AS MAX_VAL
           FROM T
          WHERE 1 = 1 ) M
 ORDER BY CASE NM WHEN '서울평균' THEN 1
                  WHEN '도심권'   THEN 2
                  WHEN '동북권'   THEN 3
                  WHEN '서북권'   THEN 4
                  WHEN '동남권'   THEN 5
          END
        , YYYYMM

Null(nvl)님이 2018-10-31 13:35에 작성한 댓글입니다.
이 댓글은 2018-10-31 13:40에 마지막으로 수정되었습니다.

WITH tbl1 (data_gbn, std_year, std_mon, gd_su
, gd_cdct_dstrct, gd_ne_dstrct, gd_nw_dstrct, gd_sw_dstrct, gd_se_dstrct) AS
(
SELECT 7, '2018', '07', 696000, 899000, 455000, 566000, 555000, 1169000 FROM dual
UNION ALL
SELECT 7, '2018', '08', 702000, 912000, 458000, 573000, 561000, 1179000 FROM dual
)
, tbl2 AS
(
SELECT std_year || std_mon AS acc_ym
     , DECODE(std_year || std_mon, :v_yyyymm, 1, 2) gb
     , gd_su          / 100000 AS "01"
     , gd_cdct_dstrct / 100000 AS "02"
     , gd_ne_dstrct   / 100000 AS "03"
     , gd_nw_dstrct   / 100000 AS "04"
     , gd_sw_dstrct   / 100000 AS "05"
     , gd_se_dstrct   / 100000 AS "06"
  FROM tbl1
 WHERE data_gbn = 7
   AND (std_year, std_mon)
    IN ( (SUBSTR(:v_yyyymm, 1, 4), SUBSTR(:v_yyyymm, 5, 2))
       , ( TO_CHAR(ADD_MONTHS(TO_DATE(:v_yyyymm, 'yyyymm'), -1), 'yyyy')
         , TO_CHAR(ADD_MONTHS(TO_DATE(:v_yyyymm, 'yyyymm'), -1), 'mm') )
       )
)
SELECT acc_ym
     , ord
     , DECODE(ord, '01', '서울평균'
                 , '02', '도심권' 
                 , '03', '동북권' 
                 , '04', '서북권' 
                 , '05', '서남권' 
                 , '06', '동남권' 
                 ) gubun
     , TO_CHAR(num_data, 'fm90.00') num_data
     , ROUND(
       ( MIN(DECODE(gb, 1, num_data)) OVER(PARTITION BY ord)
       - MIN(DECODE(gb, 2, num_data)) OVER(PARTITION BY ord)
       ) * 100
       / MIN(DECODE(gb, 2, num_data)) OVER(PARTITION BY ord)
       , 1) x
  FROM tbl2
 UNPIVOT (num_data FOR ord IN ("01", "02", "03", "04", "05", "06"))
 ORDER BY ord, acc_ym
;

마농(manon94)님이 2018-10-31 14:26에 작성한 댓글입니다.

Null(Nvl)님, 마농님 두분다 답변감사드립니다.

혹시.. 데이터형태를 컬럼추가형태말고

 

201807 서울평균 6.96

201808 서울평균 7.02

        서울평균 0.9

 

혹시 이런형태로도 가능할까요..?ㅎㅎㅎ..

 

k62511(k62511)님이 2018-10-31 15:10에 작성한 댓글입니다.

WITH tbl1 (data_gbn, std_year, std_mon, gd_su
, gd_cdct_dstrct, gd_ne_dstrct, gd_nw_dstrct, gd_sw_dstrct, gd_se_dstrct) AS
(
SELECT 7, '2018', '07', 696000, 899000, 455000, 566000, 555000, 1169000 FROM dual
UNION ALL
SELECT 7, '2018', '08', 702000, 912000, 458000, 573000, 561000, 1179000 FROM dual
)
, tbl2 AS
(
SELECT std_year || std_mon AS acc_ym
     , DECODE(std_year || std_mon, :v_yyyymm, 1, 2) gb
     , ROUND(gd_su          / 100000, 2) AS "01"
     , ROUND(gd_cdct_dstrct / 100000, 2) AS "02"
     , ROUND(gd_ne_dstrct   / 100000, 2) AS "03"
     , ROUND(gd_nw_dstrct   / 100000, 2) AS "04"
     , ROUND(gd_sw_dstrct   / 100000, 2) AS "05"
     , ROUND(gd_se_dstrct   / 100000, 2) AS "06"
  FROM tbl1
 WHERE data_gbn = 7
   AND (std_year, std_mon)
    IN ( (SUBSTR(:v_yyyymm, 1, 4), SUBSTR(:v_yyyymm, 5, 2))
       , ( TO_CHAR(ADD_MONTHS(TO_DATE(:v_yyyymm, 'yyyymm'), -1), 'yyyy')
         , TO_CHAR(ADD_MONTHS(TO_DATE(:v_yyyymm, 'yyyymm'), -1), 'mm') )
       )
)
SELECT ord
     , DECODE(ord, '01', '서울평균'
                 , '02', '도심권' 
                 , '03', '동북권' 
                 , '04', '서북권' 
                 , '05', '서남권' 
                 , '06', '동남권' 
                 ) gubun
     , NVL(acc_ym, '증감율') acc_ym
     , TO_CHAR(
       DECODE(GROUPING(acc_ym), 0
       , SUM(num_data)
       , ( SUM(DECODE(gb, 1, num_data))
         - SUM(DECODE(gb, 2, num_data))
         ) * 100
         / SUM(DECODE(gb, 2, num_data))
       ), 'fm90.00') num_data
  FROM tbl2
 UNPIVOT (num_data FOR ord IN ("01", "02", "03", "04", "05", "06"))
 GROUP BY ord, ROLLUP(acc_ym)
;

마농(manon94)님이 2018-10-31 15:37에 작성한 댓글입니다.

 마농님 답변감사드립니다..

혹시.. 정말정말 감사드리고 죄송한데 10g용으로 하나더 부탁드려도 될까요 ㅠㅠ

질문시에 써놓지않아 계속 요청드리네요..ㅠㅠ 죄송합니다..

k62511(k62511)님이 2018-10-31 16:26에 작성한 댓글입니다.

WITH tbl1 AS
(
SELECT 7       data_gbn
     , '2018'  std_year
     , '07'    std_mon
     ,  696000 gd_su
     ,  899000 gd_cdct_dstrct
     ,  455000 gd_ne_dstrct
     ,  566000 gd_nw_dstrct
     ,  555000 gd_sw_dstrct
     , 1169000 gd_se_dstrct
  FROM dual
 UNION ALL
SELECT 7, '2018', '08', 702000, 912000, 458000, 573000, 561000, 1179000
  FROM dual
)
, tbl2 AS
(
SELECT std_year || std_mon AS acc_ym
     , DECODE(std_year || std_mon, :v_yyyymm, 1, 2) gb
     , ROUND(gd_su          / 100000, 2) AS v1
     , ROUND(gd_cdct_dstrct / 100000, 2) AS v2
     , ROUND(gd_ne_dstrct   / 100000, 2) AS v3
     , ROUND(gd_nw_dstrct   / 100000, 2) AS v4
     , ROUND(gd_sw_dstrct   / 100000, 2) AS v5
     , ROUND(gd_se_dstrct   / 100000, 2) AS v6
  FROM tbl1
 WHERE data_gbn = 7
   AND (std_year, std_mon)
    IN ( (SUBSTR(:v_yyyymm, 1, 4), SUBSTR(:v_yyyymm, 5, 2))
       , ( TO_CHAR(ADD_MONTHS(TO_DATE(:v_yyyymm, 'yyyymm'), -1), 'yyyy')
         , TO_CHAR(ADD_MONTHS(TO_DATE(:v_yyyymm, 'yyyymm'), -1), 'mm') )
       )
)
SELECT ord
     , DECODE(ord, 1, '서울평균'
                 , 2, '도심권' 
                 , 3, '동북권' 
                 , 4, '서북권' 
                 , 5, '서남권' 
                 , 6, '동남권' 
                 ) gubun
     , NVL(acc_ym, '증감율') acc_ym
     , TO_CHAR(
       DECODE(GROUPING(acc_ym), 0
       , SUM(v)
       , ( SUM(DECODE(gb, 1, v))
         - SUM(DECODE(gb, 2, v))
         ) * 100
         / SUM(DECODE(gb, 2, v))
       ), 'fm90.00') num_data
  FROM (SELECT acc_ym, gb, ord
             , DECODE(ord, 1, v1, 2, v2, 3, v3, 4, v4, 5, v5, 6, v6) v
          FROM tbl2
             , (SELECT LEVEL ord FROM dual CONNECT BY LEVEL <= 6) -- unpivot
        )
 GROUP BY ord, ROLLUP(acc_ym)
;

마농(manon94)님이 2018-10-31 18:18에 작성한 댓글입니다.
이 댓글은 2018-10-31 18:28에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
41651데이터베이스 일대일 관계 릴레이션 변환 질문합니다. [1]
SYJ
2018-11-04
2948
41650컬럼에서 불러온 계산식 그대로 계산하는법이 있나요? [3]
장만수
2018-11-04
3226
41649가로 데이터 세로 표현 질문드립니다. [2]
백기열
2018-11-01
3687
41648출력되는 두 row 비교 문의드립니다. [6]
k62511
2018-10-31
3558
41647pl/sql YYYYMM(년,월)이 정확한 값일때만 insert [2]
dndjsxka
2018-10-30
3033
41646sqlplus "/as sysdba"로 접속이 안됩니다. [1]
이경익
2018-10-30
10670
41645SE 와 EE 차이점 [1]
이상우
2018-10-23
3159
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다