행열변환 문제가 있어요 0 8 567

by 민영 [SQL Query] mssql 행열변환 [2020.06.01 10:13:01]


N수데이터.xlsx (32,577Bytes)

안녕하세요. 도움이 필요하여 문의 드립니다. 아래와 같은 데이터가 있습니다.

[그림1]과 같은 데이터를 [그림2]와 같이 '등록번호'을 기준으로 '우선코드' (우선코드 1부터 우선으로) 순으로

동일한 등록번호에 여러가지 진단코드가 있는 경우 옆으로 나열되었으면 합니다.

(지금은 임시로 등록번호를 100~105번까지 입력하였는데 실제 데이터는 1000개 이상의 등록번호가 있습니다.)

[그림1]  'N수데이터'

등록번호 생년월일 최소진단일자 진단코드 진단코드_코드명 우선코드
100 2019-06-09 2019-12-20 DI004195 Encephalitis(뇌염) 1
101 2017-10-06 2019-09-04 DI004195 Encephalitis(뇌염) 1
101 2017-10-06 2019-09-06 DI048802 Autoimmune encephalitis(자가면역 뇌염) 2
102 2019-08-13 2019-12-30 DI047543 Ventriculitis(뇌실염) 1
103 2004-04-07 2019-10-25 DI048802 Autoimmune encephalitis(자가면역 뇌염) 2
104 2002-05-02 2019-11-13 DI004188 Acute disseminated encephalomyelitis(급성 파종성 뇌척수염) 1
105 2006-03-19 2019-12-13 DI004195 Encephalitis(뇌염) 1
105 2006-03-19 2019-12-13 DI047862 Anti-NMDA receptor encephalitis(항-NMDA 수용체 뇌염) 2
105 2006-03-19 2019-12-13 DI048802 Autoimmune encephalitis(자가면역 뇌염) 3

[그림2]

등록번호 생년월일 최소진단일자 진단코드 진단코드_코드명 우선코드 생년월일 최소진단일자 진단코드 진단코드_코드명 우선코드 생년월일 최소진단일자 진단코드 진단코드_코드명 우선코드
100 2019-06-09 2019-12-20 DI004195 Encephalitis(뇌염) 1                    
101 2017-10-06 2019-09-04 DI004195 Encephalitis(뇌염) 1 2017-10-06 2019-09-06 DI048802 Autoimmune encephalitis(자가면역 뇌염) 2          
102 2019-08-13 2019-12-30 DI047543 Ventriculitis(뇌실염) 1                    
103 2004-04-07 2019-10-25 DI048802 Autoimmune encephalitis(자가면역 뇌염) 2                    
104 2002-05-02 2019-11-13 DI004188 Acute disseminated encephalomyelitis(급성 파종성 뇌척수염) 1                    
105 2006-03-19 2019-12-13 DI004195 Encephalitis(뇌염) 1 2006-03-19 2019-12-13 DI047862 Anti-NMDA receptor encephalitis(항-NMDA 수용체 뇌염) 2 2006-03-19 2019-12-13 DI048802 Autoimmune encephalitis(자가면역 뇌염) 3
by JYK94 [2020.06.01 10:35:21]

일단 생각나는 대로 한번 끄적여 봅니다.

SELECT 
    A.등록번호
    , A.생년월일
    , A.최소진단일자
    , A.진단코드
    , A.진단코드_코드명
    , A.우선코드
    , B.생년월일
    , B.최소진단일자
    , B.진단코드
    , B.진단코드_코드명
    , B.우선코드
    , C.생년월일
    , C.최소진단일자
    , C.진단코드
    , C.진단코드_코드명
    , C.우선코드
FROM MAIN_T A
  LEFT OUTER JOIN MAIN_T B
    ON A.등록번호 = B.등록번호
    AND B.우선코드 = '2'
  LEFT OUTER JOIN MAIN_T C
    ON A.등록번호 = C.등록번호
             AND C.우선코드 = '3'
WHERE A.우선코드 = '1'

;

 

같은 테이블을 3번 조회 하는거라 효율성이 좋진 않을 것 같습니다.


by 민영 [2020.06.01 10:49:16]

이건 실행이 안되는 것 같아요....

그림1에서 그림2를 생성하는것인데......쉽지가 않아요..ㅠㅠㅠ

 


by 마농 [2020.06.01 10:57:22]

답변에 문제가 없어 보이는데요.
"안되는 것 같다?"는 확실하지 않은 표현 말고
뭐가 어떻게 안되는지? 에러가 나는지? 어떻게 작성했는지? 등 명확하게 표현해 주세요.


by 마농 [2020.06.01 10:58:10]
SELECT 등록번호, 생년월일
     , MIN(CASE 우선코드 WHEN 1 THEN 최소진단일자    END)    최소진단일자_1
     , MIN(CASE 우선코드 WHEN 1 THEN 진단코드        END)        진단코드_1
     , MIN(CASE 우선코드 WHEN 1 THEN 진단코드_코드명 END) 진단코드_코드명_1
     , MIN(CASE 우선코드 WHEN 2 THEN 최소진단일자    END)    최소진단일자_2
     , MIN(CASE 우선코드 WHEN 2 THEN 진단코드        END)        진단코드_2
     , MIN(CASE 우선코드 WHEN 2 THEN 진단코드_코드명 END) 진단코드_코드명_2
     , MIN(CASE 우선코드 WHEN 3 THEN 최소진단일자    END)    최소진단일자_3
     , MIN(CASE 우선코드 WHEN 3 THEN 진단코드        END)        진단코드_3
     , MIN(CASE 우선코드 WHEN 3 THEN 진단코드_코드명 END) 진단코드_코드명_3
  FROM N수데이터
 GROUP BY 등록번호, 생년월일
;

 


by 민영 [2020.06.01 14:39:46]

네, 알려주셔서 감사드립니다.

알려주신 사항으로 하니 아주 잘 됩니다. 그런데 한가지만 더 문의 드려도 될까요?

 

만약 우선코드가 '2'만 존재하는 데이터는 순서에 따라 우선코드가 2이지만 1에 해당하는 값에 붙어야 하는데 현재는

그렇지가 않습니다. 또한 만약 하나의 등록번호에 우선코드가 1인 데이터가 두개인 경우 하나는 붙지않고 하나만 붙는데(어느것이 먼저와도 상관없습니다.) 이러한 경우는 어떻게 해결해야 하나요?

 


by 마농 [2020.06.02 13:14:35]
SELECT 등록번호, 생년월일
     , MIN(CASE rn WHEN 1 THEN 우선코드        END)        우선코드_1
     , MIN(CASE rn WHEN 1 THEN 최소진단일자    END)    최소진단일자_1
     , 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
     , MIN(CASE rn WHEN 2 THEN 진단코드        END)        진단코드_2
     , MIN(CASE rn WHEN 2 THEN 진단코드_코드명 END) 진단코드_코드명_2
     , MIN(CASE rn WHEN 3 THEN 우선코드        END)        우선코드_3
     , MIN(CASE rn WHEN 3 THEN 최소진단일자    END)    최소진단일자_3
     , MIN(CASE rn WHEN 3 THEN 진단코드        END)        진단코드_3
     , MIN(CASE rn WHEN 3 THEN 진단코드_코드명 END) 진단코드_코드명_3
  FROM (SELECT 등록번호, 생년월일
             , 우선코드, 최소진단일자, 진단코드, 진단코드_코드명
             , ROW_NUMBER() OVER(PARTITION BY 등록번호 ORDER BY 우선코드) rn
          FROM N수데이터
        ) a
 GROUP BY 등록번호, 생년월일
;

 


by JYK94 [2020.06.01 11:07:16]
WITH T ( MAIN_NO, YYMMDD, DT, CD, CD_NM, SEQ )
	 AS (SELECT '100'
			   ,'2019-06-09'
			   ,'2019-12-20'
			   ,'DI004195'
			   ,'Encephalitis(뇌염)'
			   ,1
		   FROM DUAL
		 UNION ALL
		 SELECT '101'
			   ,'2017-10-06'
			   ,'2019-09-04'
			   ,'DI004195'
			   ,'Encephalitis(뇌염)'
			   ,1
		   FROM DUAL
		 UNION ALL
		 SELECT '101'
			   ,'2017-10-06'
			   ,'2019-09-06'
			   ,'DI048802'
			   ,'Autoimmune encephalitis(자가면역 뇌염)'
			   ,2
		   FROM DUAL
		 UNION ALL
		 SELECT '102'
			   ,'2019-08-13'
			   ,'2019-12-30'
			   ,'DI047543'
			   ,'Ventriculitis(뇌실염)'
			   ,1
		   FROM DUAL
		 UNION ALL
		 SELECT '103'
			   ,'2004-04-07'
			   ,'2019-10-25'
			   ,'DI048802'
			   ,'Autoimmune encephalitis(자가면역 뇌염)'
			   ,2
		   FROM DUAL
		 UNION ALL
		 SELECT '104'
			   ,'2002-05-02'
			   ,'2019-11-13'
			   ,'DI004188'
			   ,'Acute disseminated encephalomyelitis(급성 파종성 뇌척수염)'
			   ,1
		   FROM DUAL
		 UNION ALL
		 SELECT '105'
			   ,'2006-03-19'
			   ,'2019-12-13'
			   ,'DI004195'
			   ,'Encephalitis(뇌염)'
			   ,1
		   FROM DUAL
		 UNION ALL
		 SELECT '105'
			   ,'2006-03-19'
			   ,'2019-12-13'
			   ,'DI047862'
			   ,'Anti-NMDA receptor encephalitis(항-NMDA 수용체 뇌염)'
			   ,2
		   FROM DUAL
		 UNION ALL
		 SELECT '105'
			   ,'2006-03-19'
			   ,'2019-12-13'
			   ,'DI048802'
			   ,'Autoimmune encephalitis(자가면역 뇌염)'
			   ,3
		   FROM DUAL)
  SELECT A.*
		,B.YYMMDD
		,B.DT
		,B.CD
		,B.CD_NM
		,B.SEQ
		,C.YYMMDD
		,C.DT
		,C.CD
		,C.CD_NM
		,C.SEQ
	FROM T A
		LEFT OUTER JOIN T B
			ON A.MAIN_NO = B.MAIN_NO AND B.SEQ = 2
		LEFT OUTER JOIN T C
			ON A.MAIN_NO = C.MAIN_NO AND C.SEQ = 3
   WHERE A.SEQ = 1

by 민영 [2020.06.01 14:40:30]

자세하게 알려주셔서 감사드립니다. 덕분에 해결하였습니다.

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