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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值