컬럼 데이터를 결합하여 컬럼으로 사용하고 거기에 데이터값을 부여하는 방법 질문드립니다. 0 5 441

by 아이언조 [PL/SQL] [2021.11.16 10:13:40]


ID code rl max min id
id1 code1 L 14 14 0
id1 code1 R 13 13 0
id2 code2 R 15 15 0
id2 code2 L 12 12 0
select
ID, code, rl, max, min, id 
from Datatable

위표처럼 이런식의 테이블이 존재하는데요 이걸 데이터를 가공할 목적으로  아래와 같이 가공하려면 어떻게 해야할까요

현재까지는  case wehn then 이나 jsonb_each_text(to_jsonb(a)) as x("key",value) 같은 방법으로 시도해 보고있긴한데 답이 나오질 않습니다..

솔지깋 가능한건지 의문이드는데... 혹시라도 방법이 있다면 정보 좀 부탁드리겠습니다 ㅠㅠ

1. id데이터 별로 row 데이터에서 값을 조합하여 그값을 컬럼으로 사용해야하고

2. 그 값에 맞는 min max id 값을 데이터로 줘야합니다 

<원하는 출력 모양> 

ID code1_L_max code1_L_min code1_L_id code1_R_max code1_R_min code1_R_id code2_L_max code2_L_min code2_L_id code2_R_max code2_R_min code2_R_id
id1 14 14 0 13 13 0            
id2             15 15 0 12 12 0

값이 없는부분은 null이여도 상관없습니다.

혹시 이런식으로 쿼리를 사용하여 데이터를 뽑을수있을까요? 도움 부탁드립니다.

 

 

==============================================================

해결방법 :

마농님께서 달아주신 댓글과 마찬가지로 저는 code 값이 고정이지만 그 유형이  많기때문에 일일히 쿼리를 수작업 하기힘들어서

동적 쿼리를 만들어서 원하는 데이터 형식으로 추출했습니다.

 

 

by 마농 [2021.11.16 11:23:21]

1. 컬럼명이 이상하네요.
- 시스템 예약어 사용 : MIN, MAX
- 동일한 컬럼명 사용 : ID 가 두개
2. DB 종류 및 버전에 따라 쿼리가 다릅니다.
- DB 종류 및 버전 알려주세요.


by 아이언조 [2021.11.16 11:35:39]

아 제가 컬럼명을 단순하게 보여드릴 용도로 바꾸다보니 시스템예약어를 사용해버렸습니다

1. 데이터는 저러 형식으로 같은 코드값이 여러 row가 존재합니다. code의 종류도 여러개 이고 
그거에 맞는 max , min., id 값이 각각 존재합니다. 모든 컬럼의 값이 중복되는 경우는 없구요 ㅠㅠ

2. DB종류는 postgresql 이고 버전은 12.6 버전 사용중입니다.


by 마농 [2021.11.16 11:32:50]
WITH t AS
(
SELECT 'id1' id, 'code1' code, 'L' rl, 14 max_v, 14 min_v, 0 id_v FROM dual
UNION ALL SELECT 'id1', 'code1', 'R', 13, 13, 0 FROM dual
UNION ALL SELECT 'id2', 'code2', 'R', 15, 15, 0 FROM dual
UNION ALL SELECT 'id2', 'code2', 'L', 12, 12, 0 FROM dual
)
-- Oracle --
SELECT id
     , MIN(CASE WHEN code = 'code1' AND rl = 'L' THEN max_v END) code1_L_max
     , MIN(CASE WHEN code = 'code1' AND rl = 'L' THEN min_v END) code1_L_min
     , MIN(CASE WHEN code = 'code1' AND rl = 'L' THEN  id_v END) code1_L_id
     , MIN(CASE WHEN code = 'code1' AND rl = 'R' THEN max_v END) code1_R_max
     , MIN(CASE WHEN code = 'code1' AND rl = 'R' THEN min_v END) code1_R_min
     , MIN(CASE WHEN code = 'code1' AND rl = 'R' THEN  id_v END) code1_R_id
     , MIN(CASE WHEN code = 'code2' AND rl = 'L' THEN max_v END) code2_L_max
     , MIN(CASE WHEN code = 'code2' AND rl = 'L' THEN min_v END) code2_L_min
     , MIN(CASE WHEN code = 'code2' AND rl = 'L' THEN  id_v END) code2_L_id
     , MIN(CASE WHEN code = 'code2' AND rl = 'R' THEN max_v END) code2_R_max
     , MIN(CASE WHEN code = 'code2' AND rl = 'R' THEN min_v END) code2_R_min
     , MIN(CASE WHEN code = 'code2' AND rl = 'R' THEN  id_v END) code2_R_id
  FROM t
 GROUP BY id
 ORDER BY id
;

 


by 아이언조 [2021.11.16 11:50:28]

답변 감사합니다 ㅎ 마농님이 달아주신 이런류의 질문들 찾아봤습니다

제 질문도 code 값이 여러개라면  code 유형만큼 case when 셋트를 추가시키거나

동적 쿼리를 사용할수 밖에 없는거죠?


by 마농 [2021.11.16 12:16:43]

네. 컬럼 개수를 가변적으로 적용하는 쿼리는 없습니다.

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