[英]Oracle SQL Transpose rows into columns
我有以下数据结果集。
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_TYPE
和VALUE
来转置这些行。
我正在尝试实现以下结果:
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;
注意:您将数字和字符串存储在VALUE
列中。 当您想将值视为其本机类型时,这可能会很棘手。
使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.