2016-08-23 3 views
0

다음 데이터 결과 집합이 있습니다.Oracle SQL 행을 열로 바꿈

REQUEST_ID ATTRIBUTE_TYPE VENDOR LANG_ID PROJ_DESC  COST_TYPE VALUE 
     1 DOCUMENT  JLK 1188  SAMPLE PROJECT1 USAGE_COST 500 
     1 DOCUMENT  JLK 1188  SAMPLE PROJECT1 EXP_COST 350 
     1 DOCUMENT  JLK 1188  SAMPLE PROJECT1 COMMENTS OK 
     1 DOCUMENT  JLK 1194  SAMPLE PROJECT1 USAGE_COST 400 
     1 DOCUMENT  JLK 1194  SAMPLE PROJECT1 EXP_COST 575 
     1 DOCUMENT  JLK 1194  SAMPLE PROJECT1 COMMENTS DONE 
     1 DOCUMENT  JLK 1188  SAMPLE PROJECT2 USAGE_COST 100 
     1 DOCUMENT  JLK 1188  SAMPLE PROJECT2 EXP_COST 200 
     1 DOCUMENT  JLK 1188  SAMPLE PROJECT2 COMMENTS ACCEPTED 
     1 DOCUMENT  JLK 1194  SAMPLE PROJECT2 USAGE_COST 300 
     1 DOCUMENT  JLK 1194  SAMPLE PROJECT2 EXP_COST 400 
     1 DOCUMENT  JLK 1194  SAMPLE PROJECT2 COMMENTS GOOD 
내가 열 LANG_ID, PROJ_DESC, COST_TYPEVALUE를 사용하여 이러한 행을 바꾸어 싶습니다

.

나는 아래의 결과를 달성하기 위해 노력하고이에

REQUEST_ID ATTRIBUTE_TYPE VENDOR LANG_ID PROJ_DESC  USAGE_COST EXP_COST TOTAL_COST COMMENTS 
     1 DOCUMENT  JLK 1188 SAMPLE PROJECT1  500  350  850 OK 
     1 DOCUMENT  JLK 1194 SAMPLE PROJECT1  400  575  975 DONE 
     1 DOCUMENT  JLK 1188 SAMPLE PROJECT2  100  200  300 ACCEPTED 
     1 DOCUMENT  JLK 1194 SAMPLE PROJECT2  300  400  700 GOOD 

어떤 도움은 매우 극명하게 될 것이다.

감사합니다.

select REQUEST_ID, ATTRIBUTE_TYPE, VENDOR, LANG_ID, PROJ_DESC, 
     max(case when COST_TYPE = 'USAGE_COST' then value end) as usage_cost, 
     max(case when EXP_TYPE = 'EXP_COST' then value end) as exp_cost, 
     max(case when COST_TYPE = 'COMMENTS' then value end) as comments 
from t 
group by REQUEST_ID, ATTRIBUTE_TYPE, VENDOR, LANG_ID, PROJ_DESC; 

참고 :

답변

0

한 가지 방법은 조건부 집계를 사용하는 당신은 VALUE 열에서 숫자와 문자열을 모두 저장된다. 값을 고유 한 유형으로 처리하려는 경우 이는 까다로울 수 있습니다.

0

PIVOT을 사용하는 솔루션 (Oracle 11.1부터 사용 가능). 그러면 total_cost 열이 추가되고 비용이 숫자로 명시 적으로 변환됩니다.

with 
    input_data(REQUEST_ID, ATTRIBUTE_TYPE, VENDOR, LANG_ID, PROJ_DESC, COST_TYPE, VALUE) as (
    select 1, 'DOCUMENT', 'JLK', 1188, 'SAMPLE PROJECT1', 'USAGE_COST', '500'  from dual union all 
    select 1, 'DOCUMENT', 'JLK', 1188, 'SAMPLE PROJECT1', 'EXP_COST' , '350'  from dual union all 
    select 1, 'DOCUMENT', 'JLK', 1188, 'SAMPLE PROJECT1', 'COMMENTS' , 'OK'  from dual union all 
    select 1, 'DOCUMENT', 'JLK', 1194, 'SAMPLE PROJECT1', 'USAGE_COST', '400'  from dual union all 
    select 1, 'DOCUMENT', 'JLK', 1194, 'SAMPLE PROJECT1', 'EXP_COST' , '575'  from dual union all 
    select 1, 'DOCUMENT', 'JLK', 1194, 'SAMPLE PROJECT1', 'COMMENTS' , 'DONE'  from dual union all 
    select 1, 'DOCUMENT', 'JLK', 1188, 'SAMPLE PROJECT2', 'USAGE_COST', '100'  from dual union all 
    select 1, 'DOCUMENT', 'JLK', 1188, 'SAMPLE PROJECT2', 'EXP_COST' , '200'  from dual union all 
    select 1, 'DOCUMENT', 'JLK', 1188, 'SAMPLE PROJECT2', 'COMMENTS' , 'ACCEPTED' from dual union all 
    select 1, 'DOCUMENT', 'JLK', 1194, 'SAMPLE PROJECT2', 'USAGE_COST', '300'  from dual union all 
    select 1, 'DOCUMENT', 'JLK', 1194, 'SAMPLE PROJECT2', 'EXP_COST' , '400'  from dual union all 
    select 1, 'DOCUMENT', 'JLK', 1194, 'SAMPLE PROJECT2', 'COMMENTS' , 'GOOD'  from dual 
    ) 
select request_id, attribute_type, vendor, lang_id, proj_desc, 
     to_number(usage_cost) as usage_cost, to_number(exp_cost) as exp_cost, 
     to_number(usage_cost) + to_number(exp_cost) as total_cost, comments 
from input_data 
pivot (max(value) for cost_type in ('USAGE_COST' as usage_cost, 
             'EXP_COST' as exp_cost , 
             'COMMENTS' as comments 
            ) 
    ) 
; 

출력 :

REQUEST_ID ATTRIBUT VEN LANG_ID PROJ_DESC  USAGE_COST EXP_COST TOTAL_COST COMMENTS 
---------- -------- --- ------- --------------- ---------- ---------- ---------- -------- 
     1 DOCUMENT JLK 1194 SAMPLE PROJECT2  300  400  700 GOOD 
     1 DOCUMENT JLK 1194 SAMPLE PROJECT1  400  575  975 DONE 
     1 DOCUMENT JLK 1188 SAMPLE PROJECT1  500  350  850 OK 
     1 DOCUMENT JLK 1188 SAMPLE PROJECT2  100  200  300 ACCEPTED