oracle行转列处理方法,oracle行转列解决办法

oracle行转列

Cust prod

1       A

1       B

1       C

2       A

2       B

Return

Cust     Prod1     Prod2       Prod3

1           A            B               C

2           A            B               Null

怎么搞啊

------解决方案--------------------

慢慢搞

select Cust,

MAX(decode(prod,'A','A')) Prod1,

MAX(decode(prod,'B','B')) Prod2,

MAX(decode(prod,'C','C')) Prod3

from ax

GROUP BY Cust;

CUST PROD1 PROD2 PROD3

---------- ----- ----- -----

1 A     B     C

2 A     B

------解决方案--------------------

要看数据是否固定了 如果不确定行数 只能用动态sql判断了 还要判断prod是否相同...

------解决方案--------------------

--创建测试表 插入测试数据

create table tb1 (cust number,prod nvarchar2(5));

insert into tb1 values (1,'A');

insert into tb1 values (1,'B');

insert into tb1 values (1,'C');

insert into tb1 values (2,'A');

insert into tb1 values (2,'B');

commit;

--创建存储过程

CREATE OR REPLACE PROCEDURE T_TEST

IS

V_SQL NVARCHAR2(2000);

CURSOR CURSOR_1 IS

SELECT DISTINCT PROD

FROM TB1

ORDER BY PROD;

BEGIN

V_SQL := 'SELECT CUST ';

FOR V_TB IN CURSOR_1

LOOP

V_SQL := V_SQL

------解决方案--------------------

','

------解决方案--------------------

'MAX(DECODE(T.PROD,'''

------解决方案--------------------

V_TB.PROD

------解决方案--------------------

''',T.PROD,NULL)) AS PROD_'

------解决方案--------------------

V_TB.PROD

------解决方案--------------------

'';

END LOOP;

V_SQL := V_SQL

------解决方案--------------------

' FROM  TB1 T' ;

V_SQL := V_SQL

------解决方案--------------------

' GROUP BY CUST';

DBMS_OUTPUT.PUT_LINE(V_SQL);

--EXECUTE IMMEDIATE V_SQL;

END;

--执行存储过程 返回sql 执行结果

CUST   PROD_A  PROD_B  PROD_C

-------------------------------------------

11ABC

22AB

--继续插入测试数据

insert into tb1 values (2,'C');

insert into tb1 values (2,'D');

commit;

--执行存储过程 返回查询语句

CUST   PROD_A  PROD_B  PROD_C  PROD_D

-------------------------------------------

11ABC

22ABCD

--删除测试表和测试存储过程

--DROP TABLE TB1

--DROP PROCEDURE T_TEST

------解决方案--------------------

7、动态行转不定列

----------------新建测试表

CREATE TABLE tmp_user_2(USER_ID NUMBER,MODE_NAME VARCHAR2(100),TYPE_ID NUmBER);

----------------第一部分测试数据

INSERT INTO tmp_user_2 VALUES(1001, 'M1',1);

INSERT INTO tmp_user_2 VALUES(1001, 'M2',2);

INSERT INTO tmp_user_2 VALUES(1002, 'M1',3);

INSERT INTO tmp_user_2 VALUES(1002, 'M2',4);

INSERT INTO tmp_user_2 VALUES(1002, 'M3',5);

INSERT INTO tmp_user_2 VALUES(1003, 'M1',6);

COMMIT;

----------------行转列存储过程

CREATE OR REPLACE PROCEDURE P_tmp_user_2 IS

V_SQL VARCHAR2(2000);

CURSOR CURSOR_1 IS

SELECT DISTINCT T.MODE_NAME FROM tmp_user_2 T ORDER BY MODE_NAME;

BEGIN

V_SQL := 'SELECT USER_ID';

FOR V_XCLCK IN CURSOR_1 LOOP

V_SQL := V_SQL

------解决方案--------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle行转列方法有多种,以下是其中的一些: 1. 使用PIVOT函数:PIVOT函数是Oracle 11g及以上版本中提供的用于行转列的函数,可以将数据转换为数据。例如,将每个部门的员工数量转换为各个部门的,可以使用以下代码: ```sql SELECT * FROM ( SELECT department, employee_count FROM employee ) PIVOT ( SUM(employee_count) FOR department IN ('Sales', 'Marketing', 'Operations') ); ``` 2. 使用CASE语句:CASE语句可以根据条件将数据转换为数据。例如,将每个部门的员工数量转换为各个部门的,可以使用以下代码: ```sql SELECT SUM(CASE WHEN department = 'Sales' THEN employee_count ELSE 0 END) AS Sales, SUM(CASE WHEN department = 'Marketing' THEN employee_count ELSE 0 END) AS Marketing, SUM(CASE WHEN department = 'Operations' THEN employee_count ELSE 0 END) AS Operations FROM employee; ``` 3. 使用UNPIVOT函数:UNPIVOT函数可以将数据转换为数据。例如,将各个部门的员工数量转换为部门和员工数量,可以使用以下代码: ```sql SELECT department, employee_count FROM ( SELECT 'Sales' AS department, Sales AS employee_count, 'Marketing' AS department, Marketing AS employee_count, 'Operations' AS department, Operations AS employee_count FROM ( SELECT SUM(CASE WHEN department = 'Sales' THEN employee_count ELSE 0 END) AS Sales, SUM(CASE WHEN department = 'Marketing' THEN employee_count ELSE 0 END) AS Marketing, SUM(CASE WHEN department = 'Operations' THEN employee_count ELSE 0 END) AS Operations FROM employee ) ) UNPIVOT ( employee_count FOR department IN ('Sales', 'Marketing', 'Operations') ); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值