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 40585 게시물 읽기
No. 40585
할인 쿼리 관련 질문입니다.
작성자
황의중(ugomego)
작성일
2014-10-04 12:50ⓒ
2014-10-05 16:15ⓜ
조회수
7,339

할인 쿼리 질문입니다.


with t as

(

select 1 sort, 20000 price, 'AMT'  gubun, 2000 amt, NULL rate from dual union all

select 2 sort, 20000 price, 'RATE' gubun, NULL amt,   10 rate from dual union all

select 3 sort, 20000 price, 'AMT'  gubun, 3000 amt, NULL rate from dual union all

select 4 sort, 20000 price, 'RATE' gubun, NULL amt,   20 rate from dual

)

select t.*,

       row_number() over (order by sort) rnum,

       decode(gubun,'RATE',price * rate * 0.01,amt) dc_amt,

       price - sum(decode(gubun,'RATE',price * rate * 0.01,amt)) over (order by sort) remain_amt

  from t;


를 실행하면 아래와 같은 결과를 얻을 수 있습니다.


 SORT  PRICE GUBUN   AMT RATE RNUM DC_AMT REMAIN_AMT

----- ------ ----- ----- ---- ---- ------ ----------

    1  20000 AMT    2000         1   2000      18000

    2  20000 RATE          10    2   2000      16000

    3  20000 AMT    3000         3   3000      13000

    4  20000 RATE          20    4   4000       9000


그러나 원하는 결과물을 아래와 같습니다.


 SORT  PRICE GUBUN   AMT RATE RNUM DC_AMT REMAIN_AMT

----- ------ ----- ----- ---- ---- ------ ----------

    1  20000 AMT    2000         1   2000      18000

    2  20000 RATE          10    2   1800      16200

    3  20000 AMT    3000         3   3000      13200

    4  20000 RATE          20    4   2640      10560


즉 SORT 기준으로 바로 상위의 계산된 REMAIN_AMT 에 rate 를 곱하여 DC_AMT를 구하고 싶습니다.

될듯 될듯 안되서 몇일을 고민하다 올립니다.(MODEL 배제)

 

 

 

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

WITH t AS
(
SELECT 1 sort, 20000 price, 'AMT' gubun, 2000 amt, NULL rate FROM dual
UNION ALL SELECT 2, 20000, 'RATE', NULL,   10 rate FROM dual
UNION ALL SELECT 3, 20000, 'AMT' , 3000, NULL rate FROM dual
UNION ALL SELECT 4, 20000, 'RATE', NULL,   20 rate FROM dual
)
-- 1. Model 절 - 10g
SELECT *
  FROM t
 MODEL
 DIMENSION BY (ROW_NUMBER() OVER(ORDER BY sort) rn)
 MEASURES (sort, price, gubun, amt, rate, 0 dc_amt, 0 remain_amt)
 RULES ( remain_amt[ANY] = NVL(remain_amt[CV()-1], price[1])
                         - NVL( amt[CV()]
                              , NVL(remain_amt[CV()-1], price[1])
                              * rate[CV()] / 100
                              )
       , dc_amt[ANY] = NVL(remain_amt[CV()-1], price[1]) - remain_amt[CV()]
       )
;

마농(manon94)님이 2014-10-06 09:23에 작성한 댓글입니다.

WITH t AS
(
SELECT 1 sort, 20000 price, 'AMT' gubun, 2000 amt, NULL rate FROM dual
UNION ALL SELECT 2, 20000, 'RATE', NULL,   10 rate FROM dual
UNION ALL SELECT 3, 20000, 'AMT' , 3000, NULL rate FROM dual
UNION ALL SELECT 4, 20000, 'RATE', NULL,   20 rate FROM dual
)
-- 2. Recursive SQL - 11g
, t1 AS
(
SELECT ROW_NUMBER() OVER(ORDER BY sort) rn
     , sort, price, gubun, amt, rate
  FROM t
)
, t2(rn, sort, price, gubun, amt, rate, dc_amt, remain_amt) AS
(
SELECT rn
     , sort, price, gubun, amt, rate
     , NVL(amt, price * rate / 100) dc_amt
     , price - NVL(amt, price * rate / 100) remain_amt
  FROM t1
 WHERE rn = 1
 UNION ALL
SELECT a.rn
     , a.sort, a.price, a.gubun, a.amt, a.rate
     , NVL(a.amt, b.remain_amt * a.rate / 100) dc_amt
     , b.remain_amt - NVL(a.amt, b.remain_amt * a.rate / 100) remain_amt
  FROM t1 a
     , t2 b
 WHERE a.rn = b.rn + 1
)
SELECT *
  FROM t2
;

마농(manon94)님이 2014-10-06 09:24에 작성한 댓글입니다.

 역시 마농님 대단하십니다.

저도 model 로 하는 방법은 했었는데 가독성이 떨어질 것 같아서 다른 방법을 찾고 있었거든요..

제가 별도로 테스트 해보겠지만 속도면에서 재귀쿼리가 나을까요? model 이 나을까요?

황의중(ugomego)님이 2014-10-06 10:27에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40588오라클 8 버전에서 100만건 이상 한번에 업데이트 [1]
박정원
2014-10-15
7733
40587분류명만 있는 데이터를 부모 일련번호를 포함한 데이터로 가공해야 하는데 도와주세요.
김성욱
2014-10-14
6739
40586강제적인 순차 자료를 조회해야 합니다. 마농님 도와주세요.....ㅜ.ㅜ [2]
도끼발
2014-10-09
7697
40585할인 쿼리 관련 질문입니다. [3]
황의중
2014-10-04
7339
40584몇번째 구분자 사이의 문자열만 추출 [4]
조성훈
2014-10-01
7965
40583쿼리 질문 드려봅니다. [2]
야간비행
2014-09-30
7539
40582그룹핑 질문입니다. [2]
홍감자
2014-09-30
8098
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다