우선, 귀하의 데이터 모델은 당신을 힘들게 만들고 있습니다. 연속적인 분기를 쉽게 찾을 수있는 방법이 필요합니다. 따라서 상승 추세 인 키를 사용하여 해당 정보를 보관할 테이블이 필요합니다. 2008 년 봄 2009이 봄 2009 이후인지 컴퓨터가 알 수 있다고 생각하십니까?
어쨌든 여기 테스트 데이터가 있습니다.나는 쉽게 무슨 일이 일어나고 있는지 볼 수 있도록 이름을 사용하고 있습니다 : 당신이 볼 수 있듯이
SQL> select s.name as student
2 , c.name as class
3 , q.season||' '||q.year as quarter
4 , q.q_id
5 , c.base_cost
6 from enrolments e
7 join students s
8 on (s.s_id = e.s_id)
9 join classes c
10 on (c.c_id = e.c_id)
11 join quarters q
12 on (q.q_id = c.q_id)
13 order by s.s_id, q.q_id
14/
STUDENT CLASS QUARTER Q_ID BASE_COST
---------- -------------------- --------------- ---------- ----------
Sheldon Introduction to SQL Spring 2008 100 100
Sheldon Advanced SQL Spring 2009 104 150
Howard Introduction to SQL Spring 2008 100 100
Howard Information Theory Summer 2008 101 75
Rajesh Information Theory Summer 2008 101 75
Leonard Crypto Foundation Autumn 2008 102 120
Leonard PHP for Dummies Winter 2008 103 90
Leonard Advanced SQL Spring 2009 104 150
8 rows selected.
SQL>
, 나는 누구의 기본 키 Q_ID 증가 하나 역법 위해 테이블 숙소를 가지고있다. 나는이 문제를 해결하기 위해 오라클 구문을 사용하는거야
, 특히 LAG 분석 함수 :
SQL> select s.name as student
2 , c.name as class
3 , q.season||' '||q.year as quarter
4 , q.q_id
5 , c.base_cost
6 , lag (q.q_id) over (partition by s.s_id order by q.q_id) prev_q_id
7 from enrolments e
8 join students s
9 on (s.s_id = e.s_id)
10 join classes c
11 on (c.c_id = e.c_id)
12 join quarters q
13 on (q.q_id = c.q_id)
14 order by s.s_id, q.q_id
15/
STUDENT CLASS QUARTER Q_ID BASE_COST PREV_Q_ID
---------- -------------------- --------------- ---------- ---------- ----------
Sheldon Introduction to SQL Spring 2008 100 100
Sheldon Advanced SQL Spring 2009 104 150 100
Howard Introduction to SQL Spring 2008 100 100
Howard Information Theory Summer 2008 101 75 100
Rajesh Information Theory Summer 2008 101 75
Leonard Crypto Foundation Autumn 2008 102 120
Leonard PHP for Dummies Winter 2008 103 90 102
Leonard Advanced SQL Spring 2009 104 150 103
8 rows selected.
SQL>
는 그래서, PREV_Q_ID 열에서 보면 우리가 하워드, 셀던과 레너드는 각각 촬영 한 것을 볼 수 있습니다 더 한 코스보다. Leonard만이 세 가지 코스를 택했습니다. PREV_Q_ID와 Q_ID 열의 값을 비교하면 Howard의 두 코스가 보존적인 구역에 있지만 Sheldon 's는 그렇지 않은 것을 알 수 있습니다.
이제 우리는 약간의 수학을 수행 할 수 있습니다
SQL> select student
2 , class
3 , quarter
4 , base_cost
5 , discount*100 as discount_pct
6 , base_cost - (base_cost*discount) as actual_cost
7 from
8 (select student
9 , class
10 , quarter
11 , base_cost
12 , case
13 when prev_q_id is not null
14 and q_id - prev_q_id = 1
15 then 0.2
16 else 0
17 end as discount
18 , s_id
19 , q_id
20 from
21 (
22 select s.name as student
23 , c.name as class
24 , q.season||' '||q.year as quarter
25 , q.q_id
26 , c.base_cost
27 , lag (q.q_id) over (partition by s.s_id order by q.q_id) prev_q_id
28 , s.s_id
29 from enrolments e
30 join students s
31 on (s.s_id = e.s_id)
32 join classes c
33 on (c.c_id = e.c_id)
34 join quarters q
35 on (q.q_id = c.q_id)
36 )
37 )
38 order by s_id, q_id
39/
(인공 휴식을 결과를 보려면 아래로 스크롤 할 필요를 미연에 방지하기 위해)
STUDENT CLASS QUARTER BASE_COST DISCOUNT_PCT ACTUAL_COST
---------- -------------------- ----------- ---------- ------------ -----------
Sheldon Introduction to SQL Spring 2008 100 0 100
Sheldon Advanced SQL Spring 2009 150 0 150
Howard Introduction to SQL Spring 2008 100 0 100
Howard Information Theory Summer 2008 75 20 60
Rajesh Information Theory Summer 2008 75 0 75
Leonard Crypto Foundation Autumn 2008 120 0 120
Leonard PHP for Dummies Winter 2008 90 20 72
Leonard Advanced SQL Spring 2009 150 20 120
8 rows selected.
SQL>
그래서, 하워드와 레너드는 자신의 연속에 대한 할인을받을 수업은 아니고 쉘든과 라즈는 그렇지 않아.
[oracle] 및 [mysql]에 대한 태그가 있습니다. 데이터베이스 둘 다 또는 둘 다에 대한 솔루션을 원하십니까? ORCL 회사가 현재 MySQL 제품을 소유하고 있기 때문에 [oracle]을 포함하고 있습니까? – APC