동명이인 찾기 1 8 50,440

by 동동동 [SQL Query] [2018.08.13 19:11:07]


안녕하세요..

이름과 생년월일까지 조건을 주어 동명이인을 찾으려고 하는데요..

With TMP AS (
SELECT '홍길동' NAM, '771111' NUM, '총무과' DEP FROM DUAL UNION ALL
SELECT '홍길동' NAM, '771111' NUM, '비서실' DEP FROM DUAL UNION ALL
SELECT '홍길동' NAM, '871212' NUM, '총무과' DEP FROM DUAL UNION ALL
SELECT '김길동' NAM, '871010' NUM, '총무과' DEP FROM DUAL UNION ALL
SELECT '김말똥' NAM, '871010' NUM, '총무과' DEP FROM DUAL
)
SELECT NAM, NUM, DEP, COUNT(1) OVER(PARTITION BY NAM) CNT FROM TMP;

 

얼추 원하는 값(구분만 할 수 있으면됨)

김길동    871010    총무과    1
김말똥    871010    총무과    1
홍길동    771111    비서실    2
홍길동    771111    총무과    2
홍길동    871212    총무과    2

 

다음과 같이 홍길동이 동명이인으로 검색이 되고..

 

만약 홍길동 871212 가 없을 때는

With TMP AS (
SELECT '홍길동' NAM, '771111' NUM, '총무과' DEP FROM DUAL UNION ALL
SELECT '홍길동' NAM, '771111' NUM, '비서실' DEP FROM DUAL UNION ALL
--SELECT '홍길동' NAM, '871212' NUM, '총무과' DEP FROM DUAL UNION ALL
SELECT '김길동' NAM, '871010' NUM, '총무과' DEP FROM DUAL UNION ALL
SELECT '김말똥' NAM, '871010' NUM, '총무과' DEP FROM DUAL
)
SELECT NAM, NUM, DEP, COUNT(1) OVER(PARTITION BY NAM) CNT FROM TMP;

 

구분만 할 수 있으면 됨

김길동    871010    총무과    1
김말똥    871010    총무과    1
홍길동    771111    총무과    1
홍길동    771111    비서실    1

 

부서가 달라 두줄이 나오지만 이름과 생년월일이 같으므로 동명이인에서는 제외 되게 하고 싶습니다..

 

도움 부탁드립니다..

 

by 동동동 [2018.08.13 19:30:17]
With TMP AS (
SELECT '홍길동' NAM, '771111' NUM, '총무과' DEP FROM DUAL UNION ALL
SELECT '홍길동' NAM, '771111' NUM, '비서실' DEP FROM DUAL UNION ALL
SELECT '홍길동' NAM, '871212' NUM, '총무과' DEP FROM DUAL UNION ALL
SELECT '김길동' NAM, '871010' NUM, '총무과' DEP FROM DUAL UNION ALL
SELECT '김말똥' NAM, '871010' NUM, '총무과' DEP FROM DUAL
)
SELECT NAM, NUM, DEP, 
       DECODE((COUNT(1) OVER(PARTITION BY NAM) - COUNT(1) OVER(PARTITION BY NAM, NUM )), 0, 'N', 'Y') CNT FROM TMP;

 

다음 처럼 CNT가 0보다 크면 동명이인이 있는거로 해보았는데...뭔가 찝찝하네요..


by 우리집아찌 [2018.08.14 08:43:10]

이해가 안되네요. 어떤경우엔 동명이인이고 어떤경우엔 아니고?


by 동동동 [2018.08.14 08:48:49]

답글주셔서 감사드립니다..

이름은 같고 생일이 다른사람이 존재하는 경우 동명이인으로 보려고 하고 있습니다..

같은 사람이 여러 부서에 소속되어 있을수 있기 때문에 같은사람이 부서에 따라 여러줄 나올수도 있습니다..

이 경우에는 제외되고요...


by 우리집아찌 [2018.08.14 09:45:05]

그러면 첫번째 결과도 밑에것이 맞지않나요? 총무과에 같은 이름이 두명인데요?

김길동    871010    총무과    1
김말똥    871010    총무과    1
홍길동    771111    비서실    2
홍길동    771111    총무과    1
홍길동    871212    총무과    1


by 동동동 [2018.08.14 10:14:26]

답글 감사드립니다.

결론적으로는 같은사람이 중복row로 나오는건 skip하고

홍길동    771111
홍길동    871212

이 두사람이 동명이인 이다라는걸 찾을 수 있는 방법을 찾고 있습니다..


by 우리집아찌 [2018.08.14 10:28:19]
With TMP AS (
SELECT '홍길동' NAM, '771111' NUM, '총무과' DEP FROM DUAL UNION ALL
SELECT '홍길동' NAM, '771111' NUM, '비서실' DEP FROM DUAL UNION ALL
SELECT '홍길동' NAM, '871212' NUM, '총무과' DEP FROM DUAL UNION ALL
SELECT '김길동' NAM, '871010' NUM, '총무과' DEP FROM DUAL UNION ALL
SELECT '김말똥' NAM, '871010' NUM, '총무과' DEP FROM DUAL
)

SELECT NAM , NUM , DEP
     , COUNT(DISTINCT NUM) OVER(PARTITION BY NAM) GUBUN  
  FROM TMP

 


by 동동동 [2018.08.14 11:00:58]

답변 감사드립니다..

답변채택이 현재 에러가 나서 채택을 못하고 있네요...


by 우리집아찌 [2018.08.14 12:00:24]

버그는 밑에 페이지로 가셔서 등록해주세요. 

운영자도 일해야죠..   ^^*

http://www.gurubee.net/articles/bugs#

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입