ORACLE行轉列(行轉1列,行轉多列)


在oracle 11g release 2 版本中新增的listagg函數,listagg是一個實現字符串聚合的oracle內建函數;
listagg(column,'分隔符') within group (order by column) over(partition by column)
分隔符可以為空,
order by必選項,可以order by null

(1)select status,  listagg(risk_id, ',') within group (order by risk_id) from rp_risk group by status;
以status分組,將risk_id全部合並顯示在一行
(2)與許多的聚合函數類似,listagg通過加上over()子句可以實現分析功能
select risk_id, status, listagg(risk_id, ',') within group (order by risk_id) over(partition by status) from rp_risk;
選出與當前risk_id在同一個部門的所有risk_id並合並字符串
(3)listagg聚合的結果列大小限制在varchar2類型的最大值內(比如4000);
(4)合並字符串也可以用wm_concat(column_name),所有版本的oracle都可以用這個函數
 listagg()是oracle 11g release 2才有;
(5)參考鏈接

http://xpchild.blog.163.com/blog/static/10180985920108485721969/

 

--listagg(合並多行的值為字符串,只用一列來顯示)  
select status, count(*),  listagg(risk_id, ',') within group (order by risk_id) from rp_risk group by status;  
select risk_id, status, listagg(risk_id, ',') within group (order by risk_id) over(partition by status) from rp_risk;  
select risk.risk_id, listagg(officer.last_name || ',' || officer.first_name, '; ') within group(order by null) from rp_risk risk, rp_risk_area_ref re, rp_risk_area area, rp_risk_officer officer   
where risk.risk_id = re.risk_id  
and re.risk_area_id = area.risk_area_id(+)  
and area.risk_officer_id = officer.risk_officer_id(+)  
group by risk.risk_id;  
  
  
--pivot(行專列,將多行的值改為多列顯示)(for in的那個column,是某個列的值,也就是將某個列的值作為新的列的column,這個column下邊的值好像只能來自一列)  
select * from   
  (select risk.risk_id, re.risk_area_order, officer.last_name || ',' || officer.first_name fullname   
  from rp_risk risk, rp_risk_area_ref re, rp_risk_area area, rp_risk_officer officer   
  where risk.risk_id = re.risk_id  
  and re.risk_area_id = area.risk_area_id(+)  
  and area.risk_officer_id = officer.risk_officer_id(+) order by risk.risk_id desc, re.risk_area_order)  
  pivot(max(fullname) for risk_area_order in (1 primaryOfficer, 2 addtionalOffcier1, 3 addtionalOffcier2)) order by risk_id desc;  
  
  
--decode(行專列,將多行的值改為多列顯示)(decode的那個column,是某個列的值,也就是將某個列的值作為新的列的column,MAX聚集函數也可以用sum、min、avg等其他聚集函數替代)  
select risk_id,   
--max(decode(risk_area_order, 1, fullname)) primaryOfficer,  
--max(decode(risk_area_order, 2, fullname)) addtionalOffcier1,  
--max(decode(risk_area_order, 3, fullname)) addtionalOffcier1  
min(decode(risk_area_order, 1, fullname)) primaryOfficer,  
min(decode(risk_area_order, 2, fullname)) addtionalOffcier1,  
min(decode(risk_area_order, 3, fullname)) addtionalOffcier1  
from   
  (select risk.risk_id, re.risk_area_order, officer.last_name || ',' || officer.first_name fullname from rp_risk risk, rp_risk_area_ref re, rp_risk_area area, rp_risk_officer officer   
  where risk.risk_id = re.risk_id  
  and re.risk_area_id = area.risk_area_id(+)  
  and area.risk_officer_id = officer.risk_officer_id(+) order by risk.risk_id, re.risk_area_order)  
group by risk_id order by risk_id;  

 

 參考鏈接:

比較全面的:

http://blog.sina.com.cn/s/blog_010630c30100fdyp.html

http://blog.csdn.net/kingston001/article/details/7949629

關於pivot的:

http://www.oracle.com/technetwork/cn/articles/11g-pivot-101924-zhs.html

關於wm_concat的:

http://blog.csdn.net/jwlsky/article/details/7619819

http://www.cnblogs.com/8765h/archive/2012/01/14/2374378.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM