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 37862 게시물 읽기
No. 37862
전월대비 증감및 증감율 구하는 쿼리 도움 부탁드립니다.
작성자
박현(ph0625)
작성일
2010-08-16 21:41
조회수
8,635

회원테이블

입사일           신규회원수

201004         100

201005          50

201006         130

201007         140

201008          55

  201004 201005 201006 201007 201008
신규회원수 100 50 130 140 55
전월대비 증감율 0 0.5 0.86667 0.5 0.13095
누적 회원수 100 150 280 420 475

안녕하세요.. 오늘 첨 가입을 했습니다.

지금 하고 있는 것중에...

다음과 같이 결과가 나와야합니다..

각종 함수등을 이용하면 간단히 할수 있겠지만, 시스템상 그게 허용되지 않습니다.

오직 순수쿼리로만 구현을 해야하는데.. 정말 막막하더군요..

고수님들이 많은 도움 부탁드리겠습니다...

몇가지 예외조건입니다.(이것땜시 골치아픕니다..ㅠㅠ)

1.sum() over()함수, 기타 분석함수 허용이 안됨... 단, 단일로 사용하는 sum()는 가능함...

2.서브쿼리 사용이 안됨...ㅠㅠ 다만, 인라인뷰는 구현가능...

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

기능을 제한하면 쿼리만 복잡해집니다.
Sql 사용 기능에 제한을 두는 이유가 뭔가요?
낮은 버전 때문인가요?
낮은 버전때문이라면 기능의 한계로 어쩔 수 없다지만
그게 아닌 다른 이유라면? 어디까지 제한을 둬야 하는지..
말씀하신 것 빼고는 다써도 되는건지요?
순수 쿼리의 범주가 어디까지인지?
case문이나 rollup 등을 사용해도 되나요?

마농(manon94)님이 2010-08-17 08:29에 작성한 댓글입니다.
이 댓글은 2010-08-17 08:31에 마지막으로 수정되었습니다.

제가 테스트를 해본결과...

case문과 rollup()문은 허용이 되었습니다..

그러나, select ~ from 사이에 서브쿼리삽입은 허용이 안되었구요..ㅠㅠ

rank() over() 도 안되더군요...ㅠㅠ(당연히 partition by도 안먹힙니다....)

 

박현(ph0625)님이 2010-08-17 08:48에 작성한 댓글입니다.

WITH members AS
(
SELECT '201004' dt, 100 cnt FROM dual
UNION ALL SELECT '201005',  50 FROM dual
UNION ALL SELECT '201006', 130 FROM dual
UNION ALL SELECT '201007', 140 FROM dual
UNION ALL SELECT '201008',  55 FROM dual
)
SELECT DECODE(rn, 1, '신규회원수'
                , 2, '전월대비 증감율'
                , 3, '누적 회원수'    ) AS gubun
     , MIN(DECODE(dt, '201004', v)) "201004"
     , MIN(DECODE(dt, '201005', v)) "201005"
     , MIN(DECODE(dt, '201006', v)) "201006"
     , MIN(DECODE(dt, '201007', v)) "201007"
     , MIN(DECODE(dt, '201008', v)) "201008"
  FROM (SELECT a.dt
             , b.rn
             , DECODE(b.rn, 1, cnt, 2, rate, 3, scnt) AS v
          FROM (SELECT a.dt
                     , a.cnt cnt
                     , ROUND(a.cnt / SUM(b.cnt), 5) rate
                     , a.cnt + NVL(SUM(b.cnt), 0) scnt
                  FROM members a
                     , members b
                 WHERE a.dt > b.dt(+)
                 GROUP BY a.dt, a.cnt
                 ORDER BY a.dt
                ) a
             , (SELECT ROWNUM rn FROM dict WHERE ROWNUM <= 3) b
        )
 GROUP BY rn
 ORDER BY rn
;

마농(manon94)님이 2010-08-17 09:06에 작성한 댓글입니다.

WITH members AS
(
SELECT '201004' dt, 100 cnt FROM dual
UNION ALL SELECT '201005',  50 FROM dual
UNION ALL SELECT '201006', 130 FROM dual
UNION ALL SELECT '201007', 140 FROM dual
UNION ALL SELECT '201008',  55 FROM dual
)
SELECT DECODE(gid, 0, '신규회원수'
                 , 1, '전월대비 증감율'
                 , 3, '누적 회원수'    ) AS gubun
     , DECODE(gid, 0, c1, 1, ROUND(c1/s1,5), 3, c1+NVL(s1,0)) "201004"
     , DECODE(gid, 0, c2, 1, ROUND(c2/s2,5), 3, c2+NVL(s2,0)) "201005"
     , DECODE(gid, 0, c3, 1, ROUND(c3/s3,5), 3, c3+NVL(s3,0)) "201006"
     , DECODE(gid, 0, c4, 1, ROUND(c4/s4,5), 3, c4+NVL(s4,0)) "201007"
     , DECODE(gid, 0, c5, 1, ROUND(c5/s5,5), 3, c5+NVL(s5,0)) "201008"
  FROM (SELECT GROUPING_ID(1, 2) gid
             , MIN(DECODE(dt, '201004', cnt)) c1
             , MIN(DECODE(dt, '201005', cnt)) c2
             , MIN(DECODE(dt, '201006', cnt)) c3
             , MIN(DECODE(dt, '201007', cnt)) c4
             , MIN(DECODE(dt, '201008', cnt)) c5
             , SUM(CASE WHEN dt < '201004' THEN cnt END) s1
             , SUM(CASE WHEN dt < '201005' THEN cnt END) s2
             , SUM(CASE WHEN dt < '201006' THEN cnt END) s3
             , SUM(CASE WHEN dt < '201007' THEN cnt END) s4
             , SUM(CASE WHEN dt < '201008' THEN cnt END) s5
          FROM members
         GROUP BY ROLLUP(1, 2)
        )
;

마농(manon94)님이 2010-08-17 09:10에 작성한 댓글입니다.
이 댓글은 2010-08-17 09:21에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
37865쿼리 random 추출 기능 질문드립니다. [13]
빛을타고
2010-08-17
4493
37864alert log에 Resource Manager 몬가요???
황푸리엔
2010-08-17
2722
37863한 컬럼에 다중 제약조건 가능한가요? [1]
j1y3
2010-08-17
2922
37862전월대비 증감및 증감율 구하는 쿼리 도움 부탁드립니다. [4]
박현
2010-08-16
8635
37861서브쿼리 Vs 조인 [2]
초보
2010-08-16
5860
37860쿼리좀 봐주세요.. [1]
K씨
2010-08-16
3274
37859두 날짜 컬럼을 기간별로 조회하는 쿼리가 어떻게 될까요? [2]
정태영
2010-08-16
3407
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다