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 값이 고정이지만 그 유형이 많기때문에 일일히 쿼리를 수작업 하기힘들어서
동적 쿼리를 만들어서 원하는 데이터 형식으로 추출했습니다.
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 ;