2023.03.22(PJ410~PJ415 Query)

SaGo_MunGcci·2023년 3월 22일
0

업무 프로젝트

목록 보기
22/29

업무내용 : 공단검진판정화면에서 흉부방사선촬영 결과가 검사내역 최상단으로 위치하도록
(단, 기존 R판정이 최상단으로 올라가도록 되어있을텐데 그위로 올라가있도록 / 기존 기준은 그대로 두어야 함)
hint. 판정 R보다 더 큰 값으로 쿼리해오면 될듯.

SELECT PATNO
		     ,VIST_SN
		     ,HE_DT
		     ,ITEM_ITEM_CD AS ITEM_CD
		     ,ITEM_RESULT_VAL AS ANSWER
		     ,HE_FORM_DIV_CD
		     ,CASE
			  WHEN HE_FORM_DIV_CD = 'S' THEN -- 위암
		      NVL((SELECT  
                   CASE WHEN HSTK_ANSWR_CD = 'AA0000588'  THEN 'Y'
                        ELSE 'N'
                        END AS HSTK_INQRY_CD
                   FROM GRMJDQQAA
                   WHERE  PATNO             = '14827925'         -- 병원등록번호
                   AND  VIST_SN             = 34                 -- 방문횟수
                   AND  HSTK_VRSN_CD        = '0101'             -- 문진버전코드
                   AND  HSTK_TYP_CD         = 'GMJ02'            -- 문진유형코드
                   AND  HSTK_INQRY_CD       = 'AQ0000929'),'N')
		    -- 서식종류가 L이면 HSTK_INQRY_CD = AQ0001008로 설정
		    WHEN HE_FORM_DIV_CD = 'C' THEN  -- 대장암
		      NVL((SELECT  
                   CASE WHEN HSTK_ANSWR_CD  = 'AA0000588'  THEN 'Y'
                        ELSE 'N'
                        END AS HSTK_INQRY_CD
                   FROM GRMJDQQAA
                   WHERE  PATNO             = '14827925'         -- 병원등록번호
                   AND  VIST_SN             = 34                 -- 방문횟수
                   AND  HSTK_VRSN_CD        = '0101'             -- 문진버전코드
                   AND  HSTK_TYP_CD         = 'GMJ02'            -- 문진유형코드
                   AND  HSTK_INQRY_CD       = 'AQ0000964'),'N')            
           WHEN HE_FORM_DIV_CD = 'W' THEN  -- 유방암
		      NVL((SELECT  
                   CASE WHEN HSTK_ANSWR_CD  = 'AA0000588'  THEN 'Y'
                        ELSE 'N'
                        END AS HSTK_INQRY_CD
                   FROM GRMJDQQAA
                   WHERE  PATNO             = '14827925'         -- 병원등록번호
                   AND  VIST_SN             = 34                 -- 방문횟수
                   AND  HSTK_VRSN_CD        = '0101'             -- 문진버전코드
                   AND  HSTK_TYP_CD         = 'GMJ02'            -- 문진유형코드
                   AND  HSTK_INQRY_CD       = 'AQ0000941'),'N')
            WHEN HE_FORM_DIV_CD = 'L' THEN  -- 간암
		      NVL((SELECT  
                   CASE WHEN HSTK_ANSWR_CD  = 'AA0000588'  THEN 'Y'
                        ELSE 'N'
                        END AS HSTK_INQRY_CD
                   FROM GRMJDQQAA
                   WHERE  PATNO             = '14827925'         -- 병원등록번호
                   AND  VIST_SN             = 34                 -- 방문횟수
                   AND  HSTK_VRSN_CD        = '0101'             -- 문진버전코드
                   AND  HSTK_TYP_CD         = 'GMJ02'            -- 문진유형코드
                   AND  HSTK_INQRY_CD       = 'AQ0001008'),'N')       
            WHEN HE_FORM_DIV_CD = 'B' THEN  -- 자궁암
		      NVL((SELECT  
                   CASE WHEN HSTK_ANSWR_CD  = 'AA0000588'  THEN 'Y'
                        ELSE 'N'
                        END AS HSTK_INQRY_CD
                   FROM GRMJDQQAA
                   WHERE  PATNO             = '14827925'         -- 병원등록번호
                   AND  VIST_SN             = 34                 -- 방문횟수
                   AND  HSTK_VRSN_CD        = '0101'             -- 문진버전코드
                   AND  HSTK_TYP_CD         = 'GMJ02'            -- 문진유형코드
                   AND  HSTK_INQRY_CD       = 'AQ0000987'),'N')             
             WHEN HE_FORM_DIV_CD = 'A' THEN  -- 폐암
		      NVL((SELECT  
                   CASE WHEN HSTK_ANSWR_CD  = 'AA0000588'  THEN 'Y'
                        ELSE 'N'
                        END AS HSTK_INQRY_CD
                   FROM GRMJDQQAA
                   WHERE  PATNO             = '14827925'         -- 병원등록번호
                   AND  VIST_SN             = 34                 -- 방문횟수
                   AND  HSTK_VRSN_CD        = '0101'             -- 문진버전코드
                   AND  HSTK_TYP_CD         = 'GMJ02'            -- 문진유형코드
                   AND  HSTK_INQRY_CD       = 'AQ0001306'),'N')	      
		    ELSE 'N'		    
		    END AS EXIST_MEMBER
		FROM GCPJMGPAN
		WHERE  FORM_CD                     = 'PL20220101'        -- 서식코드
        AND    FORM_VER_CD                 = 'PL2022010101'     -- 서식버전 
        AND    HE_FORM_DIV_CD              = 'L'     -- 서식종류 G: 공단, T: 생활습관, S: 위암, C: 대장, B: 유방, L: 간암, W: 자궁, A: 폐암
        AND    PATNO                       = '14827925'         -- 병원등록번호 
        AND    VIST_SN                     = 34
        AND    HE_DT                       = '20230317'  
  • 원래 내가 작성해려고 했던 쿼리
SELECT   /*SQLID=kr.amc.amis.hm.gc.pj.store.mapper.HeJudgManageMapper.retrievePanItemAnswerList*/
       PATNO 
       ,VIST_SN 
       ,HE_DT 
       ,ITEM_ITEM_CD                    AS ITEM_CD 
       ,ITEM_RESULT_VAL              AS ANSWER 
       ,HE_FORM_DIV_CD
	   ,NVL((  -- 암문진표 본인인 사람체크
		  SELECT 
			CASE WHEN HSTK_ANSWR_CD = 'AA0000588' THEN 'Y' ELSE 'N' END AS HSTK_INQRY_CD
			FROM GRMJDQQAA -- 문진대답정보상세
			WHERE PATNO = '17372671'                        -- 병원등록번호
			AND VIST_SN = 26                        -- 방문횟수
			AND HSTK_VRSN_CD = '0101'                             -- 문진버전코드
			AND HSTK_TYP_CD = 'GMJ02'                           -- 문진유형코드
			AND HSTK_INQRY_CD  =
			CASE HE_FORM_DIV_CD WHEN 'S' THEN 'AQ0000929' -- 위암
			WHEN 'C' THEN 'AQ0000964'                              -- 대장암
			WHEN 'W' THEN 'AQ0000941'                             -- 유방암
			WHEN 'L' THEN 'AQ0001008'                              -- 간암
			WHEN 'B' THEN 'AQ0000987'                              -- 자궁암
			WHEN 'A' THEN 'AQ0001306'                              -- 폐암
			ELSE NULL
			END
			AND HSTK_ANSWR_CD = 'AA0000588' 
			),'N') AS EXIST_MEMBER
 FROM  GCPJMGPAN  -- 일반검진판정
 WHERE FORM_CD  = 'PC20220101'                  -- 서식코드
 AND   FORM_VER_CD = 'PC2022010101'             -- 서식버전 
 AND   HE_FORM_DIV_CD = 'C'                     -- 서식종류 G: 공단, T: 생활습관, S: 위암, C: 대장, B: 유방, L: 간암, W: 자궁, A: 폐암
 AND   PATNO = '17372671'                       -- 병원등록번호 
 AND    VIST_SN = 26                            -- 내원일련번호 
 AND    HE_DT = '20230317'                      -- 방문일자  
  • 위 SELECT CASE 문을 하나로 만들었고 WHERE절에 있는 것도 CASE WHEN으로 하나로 만들어줬줬다. 따라서 쿼리가 상당부분 줄었다.

해당 쿼리는 Oracle SQL의 NVL 함수를 사용하여, 암문진표를 조회한 결과 값이 NULL인 경우에는 'N'으로 반환하고, NULL이 아닌 경우에는 조회 결과 값을 반환하는 쿼리입니다.

암문진표 상세 정보 테이블에서 조건에 맞는 데이터를 조회합니다. 이때, 문진대답정보상세 테이블에서 PATNO(병원등록번호), VIST_SN(방문횟수), HSTK_VRSN_CD(문진버전코드), HSTK_TYP_CD(문진유형코드) 조건을 만족하고, HE_FORM_DIV_CD 값에 따라 HSTK_INQRY_CD(문진질문코드)를 선택적으로 선택합니다.

선택된 HSTK_INQRY_CD 값이 'AA0000588' 이고, HSTK_ANSWR_CD 값이 'AA0000588' 인 경우에는 'Y', 아닌 경우에는 'N'을 반환합니다. 이 결과를 NVL 함수를 사용하여 NULL인 경우 'N'으로 대체합니다.

즉, 이 쿼리는 암문진표를 조회하여 특정 암 질병여부를 확인하고, 결과 값이 NULL이 아닌 경우에는 'Y', NULL인 경우에는 'N'을 반환하는 쿼리입니다.

그러면 HSTK_INQRY_CD 값이 여러 개라도 HSTK_INQRY_CD 값이 'AA0000588'이 있으면 Y이고 없으면 N이지?

네, 맞습니다. 쿼리에서는 HE_FORM_DIV_CD 값에 따라서 선택적으로 HSTK_INQRY_CD 값을 선택하고 있으며, 선택된 HSTK_INQRY_CD 값이 'AA0000588'이고, HSTK_ANSWR_CD 값이 'AA0000588' 인 경우에는 'Y', 그렇지 않은 경우에는 'N'을 반환합니다.

따라서 HSTK_INQRY_CD 값이 여러 개일 경우, 그 중 하나라도 'AA0000588' 값이 있는 경우에는 'Y'가 반환됩니다. 만약 모든 HSTK_INQRY_CD 값이 'AA0000588'이 아닌 경우에는 'N'이 반환됩니다.

그러나 이렇게 하니까 HE_FORM_DIV_CD GCPJMGPAN테이블을 바라보고 있고 이컬럼이 아래 FROM절에서부터 WHERE절이 아무것도 없으니까 출력이 안됨.

따라서 서비스아이디를 하나더 받아서 2개를 조인함.

<select id ="retrieveExistMemberCancer" parameterType="kr.amc.amis.hm.gc.pj.entity.HeJudgDTO"  resultType="kr.amc.amis.hm.gc.pj.entity.HeJudgDTO">
     <![CDATA[
            SELECT  /*SQLID=kr.amc.amis.hm.gc.pj.store.mapper.HeJudgManageMapper.retrieveExistMemberCancer*/ 
                        CASE WHEN HSTK_ANSWR_CD = 'AA0000588' THEN 'Y' ELSE 'N' END AS EXIST_MEMBER_YN
            FROM GRMJDQQAA AA                                     -- 문진대답정보상세
                , GCPJMGPAN AN                                         -- 일반검진판정 
            WHERE AA.PATNO = #{patno}                          -- 병원등록번호
                AND AA.VIST_SN = #{vistSn}                        -- 방문횟수              
                AND AA.HSTK_VRSN_CD = '0101'                   -- 문진버전코드
                AND AA.HSTK_TYP_CD = 'GMJ02'                   -- 문진유형코드
                AND AA.HSTK_INQRY_CD  = 
                CASE AN.HE_FORM_DIV_CD
                    WHEN 'S' THEN 'AQ0000929'                             -- 위암
                    WHEN 'C' THEN 'AQ0000964'                             -- 대장암
                    WHEN 'B' THEN 'AQ0000941'                             -- 유방암
                    WHEN 'L' THEN 'AQ0001008'                              -- 간암
                    WHEN 'W' THEN 'AQ0000987'                             -- 자궁암
                    WHEN 'A' THEN 'AQ0001306'                              -- 폐암
                    ELSE NULL
                END
                AND AA.HSTK_ANSWR_CD       = 'AA0000588'
                AND AN.FORM_CD                   = #{formCd}
                AND AN.FORM_VER_CD           = #{formVerCd}
                AND AN.HE_FORM_DIV_CD       = #{heFormDivCd}
                AND ROWNUM = 1
     ]]>
    </select>
profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글