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 21916 게시물 읽기
No. 21916
값들의 합이 0인 컬럼을 제외하기 ㅠ.ㅠ 부탁합니다
작성자
PolarBear
작성일
2005-03-04 19:54
조회수
2,065

아직 SQL 내공이 깊지 못해 도저히 풀 수 없었습니다.

 

한반 학생들의 성적을 조회하는 쿼리입니다.

학생정보는 AA 테이블 , 성적정보는 BB테이블, 과목정보는 CC테이블에 각각 있습니다.

table AA

 

학번 이름
001 아무개
002 홍길동


table BB

 

과목 학번 성적
S01 001 90
S02 001 0
S01 002 100
S02 002 0


table CC

 

과목코드 과목이름
S01 국어
S02 수학


 

실제 데이터 종류는 훨씬 많지만.. 이렇다고 치고요...

 

이 데이터를 이용해서 다음과 같은 결과를 얻어야 합니다.

 

이름 국어
아무개 90
홍길동 100


 

여기서 포인트는 모든 학생이 0점인 과목을 리스트에서 제외하는데 있습니다.

실제로 과목은 100여가지가 넘고 , 학생수는 2000여명이지만 계속 추가됩니다.

100여가지의 과목들 중 배점이 없는 과목들이 있는데 그 과목들은 리스트에서 제외해야 하기 때문입니다. -- 역시 정해지진 않았습니다. 어떤 과목일 수도 있습니다.

 

꼭 한문장의 쿼리문을 이용해야 하는것은 아닙니다만, 되도록 적은 수의 쿼리를 이용해야 합니다.

데이터 양이 많아서 퍼포먼스에 상당한 영향을 미치기 때문에...

 

하루 종일 쿼리문에 코박고 있습니다....ㅠㅠ

도와주십시요... 고수님들...

 

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

질문한가지 만약 S02과목에 002학번의 수학점수가 50점이라면 결과는 어떻게 나와야 하나염?

김권유(eros)님이 2005-03-05 09:32에 작성한 댓글입니다.

리스트의 모든 사람이 0점인 데이터만 빼고 출력하는 겁니다.

002 학번 홍길동의 수학점수가 50점이라면 모든 사람의 수학점수가 출력되는겁니다.^^

PolarBear님이 2005-03-05 10:39에 작성한 댓글입니다. Edit

아래와 같이 테스트 해보세요.. ^^;;

select /*+ rule ordered */
       aa.이름,
       max(case when cc.과목코드 = 's01' then cc.과목이름 end) as 국어과목,
       max(case when cc.과목코드 = 's02' then cc.과목이름 end) as 수학과목
  from (select 과목,
           학번,
           성적
      from bb
     where 과목 > ''
       and 학번 > ''
       and 성적 > 0
    ) bb,
    aa,
       cc
 where bb.과목 = cc.과목코드
   and bb.학번 = aa.학번
 group by aa.이름

지현철(jhc6703)님이 2005-03-05 11:33에 작성한 댓글입니다.

not in을 사용한 부속질의를 사용하십시오

제가 테스트 한 결과인데요

(아 ! 꼭 비용기반을 사용하십시오 ==> analyze 하시라는...)

아래에서 Max를 사용한건 전체를 가져오는 것을 흉내내려 함이니

이부분은 무시하시길

 

SQL> select count(*) from student;

  COUNT(*)
----------
     32489

SQL> select count(*) from score;

  COUNT(*)
----------
    877203

SQL> select count(*) from subject;

  COUNT(*)
----------
        27

각각의 테스트 테이블의 건수입니다.

SQL은 다음과 같구요

 

 

Select
 Max(a.s_id) 학번,
 Max(a.s_name) 성명,
 Max(b.sub_name) 과목명,
 Max(c.score) 점수
From student a,
  subject b,
  score c
where a.s_id = c.s_id
And  c.sub_id = b.sub_id
and  c.sub_id not in
(
 select
  d.sub_id
 from score d
 having Nvl(Sum(abs(d.score)),0) = 0
 Group By
  d.sub_id
)
/

분석 결과는

Select
Max(a.s_id) 학번,
Max(a.s_name) 성명,
Max(b.sub_name) 과목명,
Max(c.score) 점수
From student a,
subject b,
score c
where a.s_id = c.s_id
And  c.sub_id = b.sub_id
and  c.sub_id not in
(
select
d.sub_id
from score d
having Nvl(Sum(abs(d.score)),0) = 0
Group By
d.sub_id
)
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      2.68       8.56       7265       5780          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      2.68       8.57       7265       5780          0           1
Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 85
Rows     Row Source Operation
-------  ---------------------------------------------------
1  SORT AGGREGATE
844714   HASH JOIN
27    TABLE ACCESS FULL SUBJECT
844714    HASH JOIN
32489     TABLE ACCESS FULL STUDENT
844714     HASH JOIN ANTI
877203      TABLE ACCESS FULL SCORE
1      VIEW
1       FILTER
27        SORT GROUP BY
877203         TABLE ACCESS FULL SCORE
********************************************************************************

 

보시면 아시겠지만 약 9초 걸립니다.

80만건의 성적 정보에 대한 질의가 9초 정도면 괜찮습니다.

김흥수(protokhs)님이 2005-03-06 01:08에 작성한 댓글입니다.

SELECT  B.이름 ,
     A.성적
FROM
( SELECT  BB.학번,
    CC.과목이름,
    BB.성적
   FROM BB ,  CC  
   WHERE AA.과목=BB과목코드
        AND BB.성적 >0
) A,
AA B
WHERE A.학번= B.학번

궁실님이 2005-03-07 15:19에 작성한 댓글입니다.
이 댓글은 2005-03-07 15:20에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
21919뭐가 잘못 되었을까요? [1]
재키
2005-03-05
775
21918Trace에 나오건이 이상해서요... [1]
data
2005-03-05
930
21917오라클 종료시... [1]
chobo
2005-03-04
838
21916값들의 합이 0인 컬럼을 제외하기 ㅠ.ㅠ 부탁합니다 [5]
PolarBear
2005-03-04
2065
21915테이블 create시 테이블 영역 'SYSTEM'에 대한 권한이 없읍 에러 [1]
hho
2005-03-04
1537
21914오라클 에러에 대한 문의 [2]
김태진
2005-03-04
2447
21913rollup 조회 기초... [3]
아폴론
2005-03-04
4774
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.024초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다