TB001(환자정보)
기관번호 | 구분코드 | 차트번호 | 입원일자 | 환자성명 | 퇴원일자 | 진료과목 | 담당의사 | 몸무게 | 키 |
00000001 | 0500 | 00000001 | 20160101 | 강동원 | 20160120 | 내과 | 홍길동 | 70 | 183 |
00000001 | 0500 | 00000002 | 20160102 | 이승기 | 20160115 | 내과 | 홍길동 | 71 | 182 |
00000001 | 0600 | 00000003 | 20160102 | 손나은 | 20160110 | 외과 | 홍길동 | 50 | 160 |
TB002(상병정보)
기관번호 | 구분코드 | 차트번호 | 입원일자 | 진료일자 | 일련번호 | 상병코드 | 상병명 | 주상병여부 | 시기구분 |
00000001 | 0500 | 00000001 | 20160101 | 20160101 | 1 | J00 | 코감기 | Y | - |
00000001 | 0500 | 00000001 | 20160101 | 20160101 | 2 | R18 | 상세불명 호흡장애 | Y | - |
00000001 | 0500 | 00000001 | 20160101 | 20160102 | 1 | G008 | 수막염 | Y | - |
00000001 | 0500 | 00000001 | 20160101 | 20160102 | 2 | I109 | 상세불명 고혈압 | Y | - |
00000001 | 0500 | 00000001 | 20160101 | 20160102 | 3 | R18 | 상세불명 호흡장애 | N | - |
00000001 | 0500 | 00000002 | 20160102 | 20160102 | 1 | J00 | 코감기 | Y | - |
00000001 | 0500 | 00000002 | 20160102 | 20160102 | 2 | G008 | 수막염 | N | - |
00000001 | 0600 | 00000003 | 20160102 | 20160102 | 1 | C18 | 결장의 악성신생물 | Y | - |
00000001 | 0600 | 00000003 | 20160102 | 20160103 | 1 | C19 | 악성종양대장부분절제술 | Y | - |
두 테이블이 있습니다.
TB001은 환자정보로 키는 기관번호, 구분코드, 차트번호, 입원일자 이고
TB002는 상병정보로 키는 기관번호, 구분코드, 차트번호, 입원일자, 진료일자, 일련번호 입니다.
하고자하는 부분은 TB001에 해당하는 환자 즉 차트번호 00000001의 환자 Row에 TB002의 상병코드, 상병명을 순서데로
뒤에 나열하고자 합니다.
TB002의 차트번호 00000001의 상병정보는 입원일자를 기준으로 할때
상병코드는 J00, R18, G008, I109, I109 ,R18 순으로 Row값으로 나열이 될텐데요
제가 필요한 값은 순서를 적용하여 첫번째, 두번째인 J00, R18 값만 추출하여 정렬하고자 합니다
MSSQL의 경우는 다음과 같이 쿼리 실행시
SELECT A.기관번호, A.구분코드, A.차트번호, A.입원일자, A.환자성명, A.퇴원일자, A.진료과목, A.담당의사, A.몸무게, A.키
,(SELECT C.상병코드
FROM
(SELECT ROW_NUMBER() OVER(ORDER BY B.진료일자, B.일련번호 ASC) AS NO, 상병코드, 상병명
FROM TB002 B WHERE B.입원일자 = A.입원일자 AND B.차트번호 = A.차트번호) AS C
WHERE NO = 1) AS 상병코드1
,(SELECT C.상병명
FROM
(SELECT ROW_NUMBER() OVER(ORDER BY B.진료일자, B.일련번호 ASC) AS NO, 상병코드, 상병명
FROM TB002 B WHERE B.입원일자 = A.입원일자 AND B.차트번호 = A.차트번호) AS C
WHERE NO = 1) AS 상병명1
,(SELECT C.상병코드
FROM
(SELECT ROW_NUMBER() OVER(ORDER BY B.진료일자, B.일련번호 ASC) AS NO, 상병코드, 상병명
FROM TB002 B WHERE B.입원일자 = A.입원일자 AND B.차트번호 = A.차트번호) AS C
WHERE NO = 2) AS 상병코드2
,(SELECT C.상병명
FROM
(SELECT ROW_NUMBER() OVER(ORDER BY B.진료일자, B.일련번호 ASC) AS NO, 상병코드, 상병명
FROM TB002 B WHERE B.입원일자 = A.입원일자 AND B.차트번호 = A.차트번호) AS C
WHERE NO = 2) AS 상병명2
FROM TB001 A
WHERE 기관번호 = '00000001'
AND 구분코드 = '0500'
결과값이 아래와 같이 나옵니다
기관번호 | 구분코드 | 차트번호 | 입원일자 | 환자명 | 퇴원일자 | 진료과 | 담당의사 | 몸무게 | 키 | 상병코드1 | 상병명1 | 상병코드2 | 상병명2 |
00000001 | 0500 | 00000001 | 20160101 | 강동원 | 20160120 | 내과 | 홍길동 | 70 | 183 | J00 | 코감기 | R18 | 상세불명 호흡장애 |
00000001 | 0500 | 00000002 | 20160102 | 이승기 | 20160115 | 내과 | 홍길동 | 71 | 182 | J00 | 코감기 | G008 | 수막염 |
MSSQL에서는 위와 같이 쿼리 실행시 결과값이 나오는데 오라클은 조금 다른거 같습니다
위와 같은 쿼리로 결과값을 나오케 하려면 어떤 식으로 해야할지가 고수님들 부탁드립니다
올리신 쿼리가 잘못되어있고, 잘못된 쿼리를 고친 후에 실행을 해봤습니다만 권사마님이 원하는 결과값하고 다르게 나오더군요. 분석함수 구간을 보완하였습니다..
SELECT A.기관번호, A.구분코드, A.차트번호, A.입원일자, A.환자성명, A.퇴원일자, A.진료과목, A.담당의사, A.몸무게, A.키
,(SELECT B.상병코드
FROM
(SELECT ROW_NUMBER() OVER(PARTITION BY B.기관기호, B.구분코드, B.차트번호, B.입원일자
ORDER BY B.진료일자, B.일련번호 ASC) AS NO
, 상병코드, 상병명, 입원일자, 차트번호
FROM TB002 B
) B
WHERE B.입원일자 = A.입원일자
AND B.차트번호 = A.차트번호
AND NO = 1
) 상병코드1
, (SELECT B.상병명
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY B.기관기호, B.구분코드, B.차트번호, B.입원일자
ORDER BY B.진료일자, B.일련번호 ASC) AS NO
, 상병코드, 상병명, 입원일자, 차트번호
FROM TB002 B
) B
WHERE NO = 1
AND B.입원일자 = A.입원일자
AND B.차트번호 = A.차트번호
) 상병명1
, (SELECT B.상병코드
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY B.기관기호, B.구분코드, B.차트번호, B.입원일자
ORDER BY B.진료일자, B.일련번호 ASC) AS NO
, 상병코드, 상병명, 입원일자, 차트번호
FROM TB002 B
) B
WHERE B.입원일자 = A.입원일자
AND B.차트번호 = A.차트번호
AND NO = 2
) 상병코드2
, (SELECT B.상병명
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY B.기관기호, B.구분코드, B.차트번호, B.입원일자
ORDER BY B.진료일자, B.일련번호 ASC) AS NO
, 상병코드, 상병명, 입원일자, 차트번호
FROM TB002 B
) B
WHERE B.입원일자 = A.입원일자
AND B.차트번호 = A.차트번호
AND NO = 2
) 상병명2
FROM TB001 A
WHERE 기관번호 = '00000001'
AND 구분코드 = '0500';
스칼라서브쿼리가 사용되어 대용량 처리시 성능 개선을 위해 인라인뷰로 데이터를 정제하는 작업이 필요합니다..
SELECT a.기관번호, a.구분코드, a.차트번호, a.입원일자 , a.환자성명, a.퇴원일자, a.진료과목, a.담당의사, a.몸무게, a.키 , b.상병코드1, b.상병명1 , b.상병코드2, b.상병명2 FROM tb001 a LEFT OUTER JOIN (SELECT 차트번호, 입원일자 -- 수정 , MIN(CASE rn WHEN 1 THEN 상병코드 END) 상병코드1 , MIN(CASE rn WHEN 1 THEN 상병명 END) 상병명1 , MIN(CASE rn WHEN 2 THEN 상병코드 END) 상병코드2 , MIN(CASE rn WHEN 2 THEN 상병명 END) 상병명2 FROM (SEELCT 차트번호, 입원일자 -- 수정 , 상병코드, 상병명 , ROW_NUMBER() OVER( PARTITION BY 차트번호, 입원일자 ORDER BY 진료일자, 일련번호) rn FROM tb002 WHERE 기관번호 = '00000001' AND 구분코드 = '0500' ) WHERE rn <= 2 GROUP BY 차트번호, 입원일자 -- 수정 ) b ON a.입원일자 = b.입원일자 AND a.차트번호 = b.차트번호 WHERE a.기관번호 = '00000001' AND a.구분코드 = '0500' ;
마농님의 서브쿼리 내용을 조금만 더하면
SELECT 차트번호, 입원일자
, MIN(CASE rn WHEN 1 THEN 상병코드 END) 상병코드1
, MIN(CASE rn WHEN 1 THEN 상병명 END) 상병명1
, MIN(CASE rn WHEN 2 THEN 상병코드 END) 상병코드2
, MIN(CASE rn WHEN 2 THEN 상병명 END) 상병명2
FROM (SELECT 차트번호, 입원일자, 상병코드, 상병명
, ROW_NUMBER() OVER(
PARTITION BY 차트번호, 입원일자
ORDER BY 진료일자, 일련번호) rn
FROM tb002
WHERE 기관기호 = '00000001'
AND 구분코드 = '0500'
)
WHERE rn <= 2
GROUP BY 차트번호, 입원일자
입니다.