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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐