반복되는 열을 줄이고 행으로 늘리고 싶습니다.( 예 3행 10열 -> 6행 5열) 0 8 630

by 일리안 [SQL Query] [2018.04.18 11:39:21]


안녕하세요 

다음처럼 해서 나오는 결과를

select 
  rownum as "ID"
  ,fromjuso as "기존주소"
  ,tojuso as "현재주소"
from 
  xxx
ID  기존주소 현재주소
1    
2    
3    

이렇게 결과를 출력하고 싶은데요 

ID 구분 주소
1 기존  
1 현재  
2 기존  
2 현재  
3 기존  
3 현재  

어떻게 해야될지 모르겠습니다.

id 가 DB에 기록되어 있는거면 단순히 기존주소조회하고 현재주소 조회한거를 이어붙이겠는데요

이게 rownum으로 부여해야할 상황이다보니까요.

제가 원하는건 하나의 열을 잘라서 행을 늘리면서도 id 값으로 기존주소, 현재주소의 세트가 정확히 맞아들어야 된다는 겁니다.

혹시 아시는분 계실까요?

by 우리집아찌 [2018.04.18 12:25:21]
WITH T (ID,"기존주소","현재주소") AS (
SELECT 1 , '기존주소1' ,'현재주소1' FROM DUAL UNION ALL
SELECT 2 , '기존주소2' ,'현재주소1' FROM DUAL UNION ALL
SELECT 3 , '기존주소3' ,'현재주소2' FROM DUAL 
)

SELECT * 
  FROM T
UNPIVOT ( 구분 FOR 주소 IN ( 기존주소 AS '기존' , 현재주소 AS '현재'  ) )

 


by 우리집아찌 [2018.04.18 12:29:07]
SELECT A.ID   
     , MIN(CASE WHEN LV = 1 THEN '기존' ELSE '현재' END) AS "구분"
     , MIN(CASE WHEN LV = 1 THEN 기존주소 ELSE 현재주소 END) AS "주소"
  FROM T A 
     , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 2 ) B
GROUP BY ID , LV   
ORDER BY ID , LV 

 


by 일리안 [2018.04.18 13:40:08]

제가 초보라 답변내용이 잘 이해가 안됩니다. 설명좀 부탁드려요

ID가 테이블에 있는 항목이 아닌데요  ID 부여를 어떻게 해야 되나요? 

그리고 T를 A라고 정하고, 뒤에 서브쿼리를 B라고 한다고 이해했는데, B를 이용하는 구문은 또 없어보여서요


by 우리집아찌 [2018.04.18 14:02:21]

ID가 ROWNUM 이었네요..

데이터 값인줄 알고..


by 마농 [2018.04.18 13:55:16]

1. ROWNUM 을 id 로 하시면 됩니다.
2. b 의 항목 lv 를 이용하고 있습니다. b.lv
3. b 집합은 1과 2 를 갖는 2행짜리 집합입니다.
 - 2행 집합과 조건 없이 조인하여 1행이 2행으로 늘어나는 형태입니다. (크로스조인, 카티션프러덕트)
4. Group By 와 MIn 은 없어도 되는 구문입니다.


by 일리안 [2018.04.18 14:36:41]
SELECT A.ID   
     , CASE WHEN B.LV = 1 THEN '기존' ELSE '현재' END AS "구분"
     , CASE WHEN B.LV = 1 THEN 기존주소 ELSE 현재주소 END AS "주소"
fROM (select rounum as ID, 기존주소, 현재주소
      from T) A
     , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 2 ) B
ORDER BY ID , LV 

요런식으로 해서 에러없이 결과가 나오긴 했는데 맞게 한걸까요?


by 마농 [2018.04.18 14:55:26]

unpivot 도 해보세요. 11G 이상.


by 일리안 [2018.04.18 15:36:03]

10 에서는 안되는건가봐요?

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