서로 다른 오더코드 검색 0 9 10,199

by AF™ [SQL Query] 데이터 추출 쿼리 오라클 조인 제외 [2013.07.15 14:34:28]


테이블의 구조는 개략적으로 아래와 같은 구조입니다.

병록번호 ... 오더코드, 오더네임, 처방일자, 처리일자 ... 비고 
0000001  ... HE111G,  처방이름, 날짜      , 날짜        ... 내용
0000001  ... HE115G, ....
0000002  ... HE111G, ....
0000003  ... HE115G, ....
0000003  ... HE120R, ....

위 같은 형식으로 대략 만개 이상의 내용이 기록되어 있습니다.

지금 필요로 하는 데이터는 0000001이나 0000003같이 오더코드는 달라도 같은 병록번호에 2개

이상의 오더코드가 주어진 경우만 추출하고자 합니다. 0000002 같이 하나만 주어진 경우는 제외

시키구요. 생각보다 쿼리문 만들기가 까다로운 듯 해서 오라클럽에 도움을 구해봅니다...^^
by 아발란체 [2013.07.15 14:51:37]

GROUP BY 병록번호, 오더코드 HAVING COUNT(*) > 1

아.. 아니다.. ㅋ 무시 하세요..

어.. 아찌님 지웠다.. 아찌님게 맞는거 같았는데..


by 우리집아찌 [2013.07.15 14:55:25]
문제 잘못이해한듯해서 지웠어요.. ㅎㅎ
까다롭다하신거 보니까 딴것이 있는듯해서요.. ㅋㅋ

by 우리집아찌 [2013.07.15 14:59:36]
-- 민망하지만 다시한번..
WITH T (c1,c2) AS (
SELECT '0000001' , 'HE111G' FROM DUAL UNION ALL
SELECT '0000001' , 'HE115G' FROM DUAL UNION ALL
SELECT '0000002' , 'HE111G' FROM DUAL UNION ALL
SELECT '0000003' , 'HE115G' FROM DUAL UNION ALL
SELECT '0000003' , 'HE120R' FROM DUAL 
)

SELECT * FROM T
WHERE c1 IN (SELECT c1 FROM T
       GROUP BY c1 HAVING COUNT(c1) > 1)

/*------------------------------------------------------*/

SELECT * FROm
(SELECT T.* , COUNT(*) OVER(PARTITION BY c1 ) cnt FROM T) 
WHERE cnt > 1

by 아발란체 [2013.07.15 15:23:32]
--저도 잘 이해한건지 모르겠지만.. 다시 한번.(아찌님 데이타셋 이용.. 호호호)
--이해 내용은 병록번호 기준, 오더코드가 중복되지 1건 이상 있는 것만 출력되는 쪽으로..
WITH T (c1,c2) AS (
 SELECT '0000001' , 'HE111G' FROM DUAL UNION ALL
 SELECT '0000001' , 'HE115G' FROM DUAL UNION ALL
 SELECT '0000002' , 'HE111G' FROM DUAL UNION ALL
 SELECT '0000003' , 'HE115G' FROM DUAL UNION ALL
 SELECT '0000003' , 'HE120R' FROM DUAL UNION ALL
 SELECT '0000004' , 'HE115G' FROM DUAL UNION ALL
 SELECT '0000004' , 'HE115G' FROM DUAL 
)
SELECT * FROM (
 SELECT
 c1, c2, DENSE_RANK() OVER(PARTITION BY c1 ORDER BY c1, c2) AS CNT
 FROM
 T
)
WHERE 
 CNT > 1

by 아발란체 [2013.07.15 15:25:38]
만약 중복 상관 없이 무조건 1건 이상이라면.

SELECT c1 FROM T GROUP BY c1 HAVING COUNT(*) > 1

by AF™ [2013.07.15 15:26:47]
기본적인 개념은 아찌님의 것이 맞네요...^^ 저도 고민하고 돌리다가 지쳐서...

역시 이런 작업에는 엑셀이 최고다 라고 생각하고 엑셀 함수로 해결해 버렸습니다.
(역시 엑셀은 신이 내린 프로그램이라 생각합니다... 응???)

by 아발란체 [2013.07.15 15:30:31]
아찌님건 오더코드를 보지 않고
병록코드 기준으로 1건 이상 있는 것 무조건 가지고 와서 카운트 하는 것입니다.

음.. 제가 너무 문제를 너무 어렵게 봤네요. ㅋㅅㅋ)/

by 풀텀 [2013.07.15 15:35:54]
with t as (
 select '00000001' as c1, 'HE11G...' as c2, '처방이름' as c3 from dual union all
 select '00000001', 'HE15G...', '처방이름' from dual union all
 select '00000002', 'HE11G...', '처방이름' from dual union all
 select '00000003', 'HE15G...', '처방이름' from dual union all
 select '00000003', 'HE20G...', '처방이름' from dual
)
select
 aa, bb, cc
from (select 
 c3 as aa, count(c1) as bb, c2 as cc
 from t
 group by c2, c3
 ) a
where bb > 1

by 풀텀 [2013.07.15 15:40:40]
아 이렇게 하면 안되는구나...
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입