MSSQL에서는 결과값이 나오는데 ORACLE은 어떻게 적용해할지 모르겠습니다 0 5 1,964

by 권사마 [2016.01.22 11:33:45]


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에서는 위와 같이 쿼리 실행시 결과값이 나오는데 오라클은 조금 다른거 같습니다

위와 같은 쿼리로 결과값을 나오케 하려면 어떤 식으로 해야할지가 고수님들 부탁드립니다

by 타이니스타 [2016.01.22 15:01:45]

올리신 쿼리가 잘못되어있고, 잘못된 쿼리를 고친 후에 실행을 해봤습니다만 권사마님이 원하는 결과값하고 다르게 나오더군요.  분석함수 구간을 보완하였습니다..

 

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';

 

 

스칼라서브쿼리가 사용되어 대용량 처리시 성능 개선을 위해  인라인뷰로 데이터를 정제하는 작업이 필요합니다..


by 권사마 [2016.01.22 15:44:08]

데이터랑 쿼리가 잘못되어있어 수정은 하였습니다

타이니스타님께서 가르쳐주신데로 적용하니 제가 원하는 데이터거 나오네요~

정말 완젼 진짜로 감사드립니다..(__)

쿼리의 길은 무궁무진하네요~

대용량 처리시에는 개선이 필요하겠군요~좋은 정보 감사합니다

 

 

 

 

 


by 마농 [2016.01.22 16:10:40]
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'
;

 


by 타이니스타 [2016.01.22 16:39:47]

마농님의 서브쿼리 내용을 조금만 더하면

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 차트번호, 입원일자

입니다.


by 권사마 [2016.01.22 17:18:41]

마농님 타이니스타님 정말 감사드립니다

outer join으로 적용하는 방법도 있네요

정말 많이 배워갑니다~

두분 모두 너무 감사드립니다^^

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