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
운영게시판
최근게시물
PostgreSQL Q&A 9506 게시물 읽기
No. 9506
성적처리하는 db함수 어떻게 해야하나요?
작성자
이기자(k3i2)
작성일
2014-12-22 17:37ⓒ
2014-12-22 17:44ⓜ
조회수
11,963

dawn_stu_data 이라는 테이블이 있고,

 

login_day필드에 시험친날,

dap_jeachul 필드는 'Y'이어야만 답이 제대로 제출된 학생이고,

ave필드에 점수가 이미있고,

 

dawn_jungdap_data테이블의 sihum_end 필드(시험종료)가 'N'에서 'Y'로 바뀌면 성적을 처리하는데,

dawn_jungdap_data테이블에 업데이트 트리거를 걸었습니다.

그 트리거 함수가 아래와같은데,

 

dawn_stu_data 테이블의 세개의 빈 필드에 데이타를 채워넣어야됩니다.

 

inwon 필드에 sungjuk 테이블의 등록된 수가 들어가면되고,

deungsu 필드에 석차를 (공동순위 도 체크)

sangwi_per 필드에 상위 몇프로 라고 들어가야되는데,

 

이걸 프로그램 처리 안하고 db함수 자체에서 가능한가요?

 

CREATE OR REPLACE FUNCTION dawn_jungdap_data_update()

RETURNS trigger AS

$BODY$

declare

gcnt integer ;

get_login_day character(10);

begin

get_login_day = to_char(Now(),'yyyy-mm-dd') ;

 

-- 시험이 종료가되면...

if coalesce(old.sihum_end,'') <> 'Y' and coalesce(new.sihum_end,'') = 'Y' then

-- 답안제출 총인원을 구한다

Select coalesce(count(*),0) As gcnt

From dawn_stu_data

Where login_day = get_login_day

And dap_jeachul = 'Y';

 

/*

 

???

 

*/

 

end if;

 

return null;

end;

$BODY$

LANGUAGE plpgsql VOLATILE

COST 100;

ALTER FUNCTION dawn_jungdap_data_update()

OWNER TO postgres;

 

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

일단 채점부터 해야겠네요.

다음 그 점수를 기준으로

등수와 상위%는 윈도우 함수로 구합니다.

그것을 인라인뷰로 이용해서 해당 테이블을 update 하면 되겠죠.

 

구문은 대강 이런 식입니다.

 

update exam a set ranknum = b.ranknum, rankper = b.rankper 
from 
  (select rank() over(order by score desc) as ranknum, 
cume_dist() over(order by score desc) * 100 as rankper,student, subject 
  from exam) b 
where a.student = b.student and a.subject = b.subject;
김상기(ioseph)님이 2014-12-23 11:47에 작성한 댓글입니다.

우와~ 대단하십니다.

이 간결한 쿼리 하나로 처리가 되네요.

 

근데, 상위%가 하단으로 맞춰지네요.

예를들어, 5명일경우

1등 : 10%

2등 : 20%

3등 : 30%

4등 : 40%

5등 : 60%

5등 : 60%

7등 : 80%

7등 : 80%

9등 : 90%

10등 : 100%

이렇게 나오는데요, 나머지는 맞는데, 5등이 50%가 나와야되고,

7등 70%가 나와야되는데, 동순위면 뒤순위 -1 기준으로 %를 구해버리네요.

동순위일경우 상위등수 기준으로 %를 줄수는 없나요?

이것만 해결되면 완벽한데 T.T

percent_rank()로하니 더 이상한결과가 나오고..

 

그리고 전체 인원수는 어떻게 구해야되나요?

그러니까... exam테이블의 총 갯수죠.

 

점수는 학생이 제출할때 정답데이타가 있어서 매겨진 상태로 저장이 됩니다.

이기자(k3i2)님이 2014-12-23 13:33에 작성한 댓글입니다.
이 댓글은 2014-12-23 14:29에 마지막으로 수정되었습니다.

전체 인원수도 인라인뷰로 join 하면 되겠죠. 이 경우는 N(학생):1(총인원)의 관계겠네요.

 

cume_dist() 함수와, percent_rank() 함수가 같은 놈인데, 

cume_dist() 함수는 마지막값을 percent_rank()는 처음 값을 기준으로 처리하네요.

5등이 50%가 되어야 한다면, 1등이 0%가 되어야 순위분포에 맞을 것 같습니다.

 

덕분에 순위분포쪽을 살펴보게 되었네요. 이 두 함수의 자세의 이야기는 인터넷 페이지들을 찾아서 공부해 보면 될 것 같습니다.

김상기(ioseph)님이 2014-12-24 10:20에 작성한 댓글입니다.

감사합니다.

덕분에 트리거로 프로그램 소스를 많이 줄였습니다. ^^

이기자(k3i2)님이 2015-01-01 17:43에 작성한 댓글입니다.
이 댓글은 2015-01-01 17:44에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
9509쿼리 좀 도와주세요. [2]
이기자
2015-01-01
11345
9508postgreSQL 쿼리 툴은 뭐가 있나요 ? [2]
**준
2014-12-24
11858
9507pgadmin3 에서 만들어진 테이블 내용 엑셀로 어떻게 불러오나요? [4]
pgsql123
2014-12-23
12536
9506성적처리하는 db함수 어떻게 해야하나요? [4]
이기자
2014-12-22
11963
9504한 테이블의 지정된 범위를 다른 테이블에 입력 어떻게 하나요? [1]
심상호
2014-12-20
11027
9502함수를 만들어서 select를 하면원하는 결과값이 안나옵니다. [3]
권영호
2014-12-18
11470
9501함수를 디버깅 해 볼수 있는 방법은 없는지요? [2]
권영호
2014-12-17
11011
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다