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 34036 게시물 읽기
No. 34036
select 쿼리문 질문 입니다. 부탁드려요.
작성자
산호세달밤(hwanmo)
작성일
2008-07-04 19:05
조회수
2,772

합격자 테이블

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

회원번호               이름                시험종류

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

123456                땡칠이                   IIS

234567                송영구                   KKB

345678                나도야                   INS

456789                망나니                   NFH

234567                송영구                   IIS

567890                김구라                   OLI

123456                땡칠이                   INS

678901                김국진                   ZZX

234567                송영구                   KNF

234567                송영구                   INS

789012                양칠국                   RBY

890123                지상렬                   ERT

123456                땡칠이                   NFS

901234                희동이                   HDY

234567                송영구                   NFS

012345                고길동                   KGD

345678                나도야                   IIS

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


다음과 같은 테이블이 있을때 시험종류 중 (IIS, INS, NFS) 세개 모두 합격한 사람을 찾는 쿼리문은 어떻게 되는지 궁금합니다.


결과는 다음과 같이 나와야 합니다.


123456                땡칠이

234567                송영구

이 글에 대한 댓글이 총 7건 있습니다.
SELECT 회원번호, 이름
  FROM 합격자
 WHERE 시험종류 IN ('IIS', 'INS', 'NFS')
 GROUP BY 회원번호, 이름
HAVING COUNT(*) = 3
마농(manon94)님이 2008-07-04 20:11에 작성한 댓글입니다.

답변 감사하지만 죄송하게도 위의 답변은 틀린것 같습니다.

IIS or INS or NFS 의 결과가 아니고, 
IIS and INS and NFS 의 결과가 필요하네요.

산호세달밤(hwanmo)님이 2008-07-04 21:19에 작성한 댓글입니다.

실행도 안해보시고 추측만 하시나요?
HAVING절의 의미를 간과하신듯.

마농(manon94)님이 2008-07-04 22:01에 작성한 댓글입니다.

우선 마농님 친절한 답변 감사 드립니다.
실행해 보았으나 원하는 결과를 못얻었습니다.
실제 레코드는 수십만건 정도 되고 시험의 종류가 훨씬 많고, 한사람이 복수의 자격증을 딸수 있습니다.

제가 마농님의 쿼리문을 이해하기에는 IIS 또는 INS 또는 NFS 중에 하나라도 가진 사람들중 카운트 해서 3인 사람들을 표시하는것 같은데, 제가 이해한 부분이 맞는지요?

제가 원하는 결과는 IIS, INS, NFS 3개 모두 합격한 사람입니다. 물론 그이외의 합격증을 더 딴사람도 포함되겠죠.

위의 쿼리에서는 원하는 3개중 IIS 하나를 따고, 그 이외에 다른 종류의 자격증을 딴 사람도 포함되는것 같습니다.

댓글 남겨주세요.
감사합니다.

산호세달밤(hwanmo)님이 2008-07-05 01:01에 작성한 댓글입니다.

마농님의 쿼리를 참고했습니다.

SELECT
회원번호
,MAX(이름) 이름
FROM
(
 SELECT
 회원번호
 ,MAX(이름) 이름
 ,시험종류
 FROM 합격자테이블
 GROUP BY 회원번호,시험종류
)
WHERE 시험종류 IN ('IIS','INS','NFS')
GROUP BY 회원번호
HAVING COUNT(*) = 3

 이걸 한번 확인해보세요...

왕초보님이 2008-07-05 08:18에 작성한 댓글입니다. Edit

[IIS 또는 INS 또는 NFS 중에 하나라도 가진 사람들중]

여기까지 이해하신것은 맞습니다.

그다음 HAVING절에서 COUNT(*) = 3 인것을 찾는것은 

자격증 3개를 모두 가졌다는 의미이지요.

카운트가 1이면 3개 자격증중 1개만 취득했다는 것이고

카운트가 2이면 3개 자격증중 2개만 취득했다는 것이고

카운트가 3이면 3개 자격증을 모두 취득했다는 것입니다.


[위의 쿼리에서는 원하는 3개중 IIS 하나를 따고, 그 이외에 다른 종류의 자격증을 딴 사람도 포함되는것 같습니다.]

이부분은 잘못 이해하셨네요.

이미 조건절에서 3개 자격증만 걸러낸것입니다.

3개 자격증만 걸러낸후 카운트가 3이 꽉찬 자료만 또다시 걸러내는거죠.


[실행해 보았으나 원하는 결과를 못얻었습니다.]

적용시키신 실행쿼리가 제가 알려드린 쿼리와 차이가 있거나

같은 자격증을 복수로 가진사람도 있는 경우로 생각됩니다.

한사람이 같은 자격을 여러개 가졌다면 테이블 설계가 잘못된것 아닌가 싶네요.

이경우 COUNT(*) 를 COUNT(DISTINCT 시험종류) 로 바꾸시면 해결됩니다.

마농(manon94)님이 2008-07-07 08:30에 작성한 댓글입니다.
이 댓글은 2008-07-07 09:33에 마지막으로 수정되었습니다.

마농님의 친절한 답변 감사드립니다.
많은 도움이 되었습니다.

산호세달밤(hwanmo)님이 2008-07-09 21:28에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
34040수불테이블 관련해서 조언좀 부탁드립니다. [2]
초보자
2008-07-07
3121
34038성시현님께 여쭤봅니다. [5]
김흥수
2008-07-05
1979
34037조인시 중복 제거요.. [1]
fell
2008-07-05
3294
34036select 쿼리문 질문 입니다. 부탁드려요. [7]
산호세달밤
2008-07-04
2772
34033하나만 알려주세요 [3]
system
2008-07-04
1903
34032프로시저 만드는중 에러나네요.. ㅠㅠ [1]
신승범
2008-07-04
2503
34031오라클 내부오류(ORA-02068) 발생..도움을 부탁드립니다.
초보
2008-07-04
4419
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다