Oracle行转列-列转行各种方式wm_concat函数、LISTAGG函数、PIVOT函数、UNPIVOT函数、非数字,以及自动动态获取要转换的列字段名(超详细)

本文详细介绍了Oracle中行转列(包括wm_concat、PIVOT函数方式)和列转行(UNPIVOT函数方式)的各种方法。通过实例展示了如何使用这些函数和操作,包括动态获取列字段名的存储过程实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、上来先看下数据以及实现结果:

行转列(decode方式):

WITH CO_ORDER AS(    
  SELECT 'DOM1' CUSTOMER, 'ZHA01' FACILITY , 4000 TEU FROM DUAL UNION ALL    
  SELECT 'DOM1' CUSTOMER, 'ZHA01' FACILITY , 5000 TEU FROM DUAL UNION ALL    
  SELECT 'DOM1' CUSTOMER, 'ZHA02' FACILITY , 9000 TEU FROM DUAL UNION ALL   
  SELECT 'DOM1' CUSTOMER, 'ZHA03' FACILITY , 9000 TEU FROM DUAL UNION ALL  
  SELECT 'DOM1' CUSTOMER, 'ZHA04' FACILITY , 4000 TEU FROM DUAL UNION ALL  
  SELECT 'DOM2' CUSTOMER, 'ZHA01' FACILITY , 6500 TEU FROM DUAL UNION ALL    
  SELECT 'DOM2' CUSTOMER, 'ZHA02' FACILITY , 6000 TEU FROM DUAL UNION ALL    
  SELECT 'DOM2' CUSTOMER, 'ZHA03' FACILITY , 5000 TEU FROM DUAL UNION ALL    
  SELECT 'DOM2' CUSTOMER, 'ZHA04' FACILITY , 3000 TEU FROM DUAL     
)
SELECT T.CUSTOMER, 
	SUM(DECODE(T.FACILITY, 'ZHA01', T.TEU)) AS ZHA01,
    SUM(DECODE(T.FACILITY, 'ZHA02', T.TEU)) AS ZHA02,
    SUM(DECODE(T.FACILITY, 'ZHA03', T.TEU)) AS ZHA03,
    SUM(DECODE(T.FACILITY, 'ZHA04', T.TEU)) AS ZHA04
FROM CO_ORDER T
GROUP BY T.CUSTOMER;

行转列(case when方式):

WITH CO_ORDER AS(      
  SELECT 'DOM1' CUSTOMER, 'ZHA01' FACILITY , 4000 TEU FROM DUAL UNION ALL      
  SELECT 'DOM1' CUSTOMER, 'ZHA01' FACILITY , 5000 TEU FROM DUAL UNION ALL      
  SELECT 'DOM1' CUSTOMER, 'ZHA02' FACILITY , 9000 TEU FROM DUAL UNION ALL     
  SELECT 'DOM1' CUSTOMER, 'ZHA03' FACILITY , 9000 TEU FROM DUAL UNION ALL    
  SELECT 'DOM1' CUSTOMER, 'ZHA04' FACILITY , 4000 TEU FROM DUAL UNION ALL    
  SELECT 'DOM2' CUSTOMER, 'ZHA01' FACILITY , 6500 TEU FROM DUAL UNION ALL      
  SELECT 'DOM2' CUSTOMER, 'ZHA02' FACILITY , 6000 TEU FROM DUAL UNION ALL      
  SELECT 'DOM2' CUSTOMER, 'ZHA03' FACILITY , 5000 TEU FROM DUAL UNION ALL      
  SELECT 'DOM2' CUSTOMER, 'ZHA04' FACILITY , 3000 TEU FROM DUAL       
) 
SELECT CUSTOMER,
    SUM (CASE WHEN FACILITY = 'ZHA01' THEN TEU ELSE 0 END) AS ZHA01, 
    SUM (CASE WHEN FACILITY = 'ZHA02' THEN TEU ELSE 0 END) AS ZHA02,
    SUM (CASE WHEN FACILITY = 'ZHA03' THEN TEU ELSE 0 END) AS ZHA03,
    SUM (CASE WHEN FACILITY = 'ZHA04' THEN TEU ELSE 0 END) AS ZHA04
FROM CO_ORDER GROUP BY CUSTOMER ORDER BY CUSTOMER;

行转列(PIVOT函数方式:)

WITH CO_ORDER AS(    
  SELECT 'DOM1' CUSTOMER, 'ZHA01' FACILITY , 4000 TEU FROM DUAL UNION ALL    
  SELECT 'DOM1' CUSTOMER, 'ZHA01' FACILITY , 5000 TEU FROM DUAL UNION ALL    
  SELECT 'DOM1' CUSTOMER, 'ZHA02' FACILITY , 9000 TEU FROM DUAL UNION ALL   
  SELECT 'DOM1' CUSTOMER, 'ZHA03' FACILITY , 9000 TEU FROM DUAL UNION ALL  
  SELECT 'DOM1' CUSTOMER, 'ZHA04' FACILITY , 4000 TEU FROM DUAL UNION ALL  
  SELECT 'DOM2' CUSTOMER, 'ZHA01' FACILITY , 6500 TEU FROM DUAL UNION ALL    
  SELECT 'DOM2' CUSTOMER, 'ZHA02' FACILITY , 6000 TEU FROM DUAL UNION ALL    
  SELECT 'DOM2' CUSTOMER, 'ZHA03' FACILITY , 5000 TEU FROM DUAL UNION ALL    
  SELECT 'DOM2' CUSTOMER, 'ZHA04' FACILITY , 3000 TEU FROM DUAL     
)
SELECT * FROM (
	SELECT T.CUSTOMER, T.FACILITY, SUM(TEU) EU FROM CO_ORDER T GROUP BY T.CUSTOMER, T.FACILITY) T 
PIVOT(SUM(T.EU) FOR FACILITY IN ('ZHA01', 'ZHA02', 'ZHA03', 'ZHA04'));

 行转列(WM_CONCAT函数方式:)

WITH CO_ORDER AS(    
  SELECT 'DOM1' CUSTOMER, 'ZHA01&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值