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 40694 게시물 읽기
No. 40694
할인율 적용하는 쿼리짜는 중인데 도와주세요..
작성자
newbie
작성일
2015-01-27 16:17ⓒ
2015-01-27 16:20ⓜ
조회수
11,416

 총 테이블 3

A table

service rate

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

a            1000

b            2000

 

B table

service  Start_time  end_time  discount_rate

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

a                   1                 2                       0

a                   3                 5                       5

a                   6                10                    10 

a                  11               20                    20

a                  21            999999              30

 

C table

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

name  service  use_time

ㄱ           b               12

ㄴ           b               20

ㄷ           b

ㄹ           b

ㅁ           b

ㅂ           b              16

ㅅ           b              25

 

지금 a, c table을 이용해서

select a.name, a.service, a.use_time, sum(a.use_tiem * b.rate)

 

   From Ctable a, Atable b

   Where a.service = b.service

   Group by a.name, a.service

   order by service, use_time, name; 

 

해서 결과물은

name service use_time sum

ㄱ           b             12           24000

ㄴ           b             20           40000

ㄷ           a              2              2000

ㄹ           a              4              4000

ㅁ           a             10            10000

ㅂ           a             16            16000

ㅅ           a             25            25000

 

이 나왔습니다.

 원하는 결과물은

 

 

ㄱ           b             12           24000

ㄴ           b             20           40000

ㄷ           a              2              2000

ㄹ           a              4              3900

ㅁ           a             10             9350

ㅂ           a             16            14150

ㅅ           a             25            20850

입니다.

b Table 을 사용해서 a service 의 할인율 적용하는법이 궁금합니다.

 

 

 

 

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

예시로 들어주신

샘플 데이터로

A 테이블과 C 테이블을 Join 해서

Select 했을시..

 

결과라고 보여지는 데이터 형태는 나올수가 없는데요?

 

샘플로 주신

C 테이블의 service 컬럼에는

모든 데이터가 'b'

이니까요.

최한영(terry0515)님이 2015-01-27 17:04에 작성한 댓글입니다.

WITH Atable AS
(
SELECT 'a' service, 1000 rate FROM dual
UNION ALL SELECT 'b', 2000 FROM dual
)
, Btable AS
(
SELECT 'a' service, 1 start_time, 2 end_time, 0 discount_rate FROM dual
UNION ALL SELECT 'a',  3,      5,  5 FROM dual
UNION ALL SELECT 'a',  6,     10, 10 FROM dual
UNION ALL SELECT 'a', 11,     20, 20 FROM dual
UNION ALL SELECT 'a', 21, 999999, 30 FROM dual
)
, Ctable AS
(
SELECT 'ㄱ' name, 'b' service, 12 use_time FROM dual
UNION ALL SELECT 'ㄴ', 'b', 20 FROM dual
UNION ALL SELECT 'ㄷ', 'a',  2 FROM dual
UNION ALL SELECT 'ㄹ', 'a',  4 FROM dual
UNION ALL SELECT 'ㅁ', 'a', 10 FROM dual
UNION ALL SELECT 'ㅂ', 'a', 16 FROM dual
UNION ALL SELECT 'ㅅ', 'a', 25 FROM dual
)
SELECT c.name
     , c.service
     , c.use_time
     , SUM
     ( a.rate
     * NVL(LEAST(c.use_time, b.end_time) - b.start_time + 1, c.use_time)
     * NVL(1 - b.discount_rate / 100, 1)
     ) AS sum
  FROM Atable a
     , Btable b
     , Ctable c
 WHERE c.service   = a.service
   AND c.service   = b.service   (+)
   AND c.use_time >= b.start_time(+)
 GROUP BY c.name
     , c.service
     , c.use_time
 ORDER BY name, service
;

마농(manon94)님이 2015-01-27 17:30에 작성한 댓글입니다.

마농님 감사합니다.

 

 

newbie님이 2015-01-28 09:08에 작성한 댓글입니다. Edit

마농님 가능하시면 sum쪽에 설명도 혹시 가능할까요....?

newbie님이 2015-01-28 09:19에 작성한 댓글입니다. Edit

SELECT c.name
     , c.service
     , c.use_time
     , a.rate
     , b.start_time
     , b.end_time
     , b.discount_rate
     , a.rate x
     , NVL(LEAST(c.use_time, b.end_time) - b.start_time + 1, c.use_time) y
     , NVL(1 - b.discount_rate / 100, 1) z
     , a.rate
     * NVL(LEAST(c.use_time, b.end_time) - b.start_time + 1, c.use_time)
     * NVL(1 - b.discount_rate / 100, 1) sum
  FROM Atable a
     , Btable b
     , Ctable c
 WHERE c.service   = a.service
   AND c.service   = b.service   (+)
   AND c.use_time >= b.start_time(+)
 ORDER BY name, service, start_time
;


Group By SUM 하기 전 조인만 한 상태의 쿼리 결과 보고 이해해 보시기 바랍니다.
기존 사용한 수식 a.rate * c.use_tiem 에 b.discount_rate 를 곱해주는 건데요.
a.rate * c.use_tiem * b.discount_rate = X * Y * Z


AND c.use_time >= b.start_time 이 조인 조건 때문에
해당 구간별로 여러행으로 나뉘게 되구요.


해당 구간의 사용시간(Y)은 (종료시간 - 시작시간 + 1) 이 되구요
종료시간과 전체시간 중 작은 것을 종료시간으로 해야 하겠지요.
LEAST(c.use_time, b.end_time) - b.start_time + 1
할인율이 등록되지 않은 것도 나오게 하기 위해 아우터조인을 했구요.
이로 인해 구간별 사용시간이 안나오게 되는 경우
NVL 을 사용해 전체사용시간으로 대체합니다.


해당 구간의 사욜률(Z)은 (1 - 할인율/100)이 되겠구요.
이 또한 널일 경우 할인이 없는것이니 사용률은 1(100%)이 되겠지요.

마농(manon94)님이 2015-01-28 09:43에 작성한 댓글입니다.

마농님//설명 감사합니다.

 

덕분에 잘 이해 한 것 같습니다.

 

좋은 하루 되세요~!

newbie님이 2015-01-28 09:54에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40697fetch 속도가 너무 느립니다. 고속fetch 어떻게 하나요? [1]
신창식
2015-01-28
7919
40696컬럼 비교후 update 시키기 [2]
조선호
2015-01-28
7542
40695세로데이터를 가로로 표현 부탁드립니다. [1]
CDS
2015-01-27
7598
40694할인율 적용하는 쿼리짜는 중인데 도와주세요.. [6]
newbie
2015-01-27
11416
40693순차자료에서 구간별 생산량 구하기 [2]
이태우
2015-01-26
7666
40692작업월력 입력 질문좀 드립니다. [5]
궁금이
2015-01-26
7571
40691재귀쿼리에서 하위 노드 값을 확인 하는 방법 [2]
임민규
2015-01-23
9553
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다