欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

oracle行转列,该如何处理

更新时间: 2014-01-05 02:10:09 责任编辑: Author_N1

 

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
-------------------------------------------
1 1 A B C
2 2 A B

--继续插入测试数据
insert into tb1 values (2,'C');
insert into tb1 values (2,'D');
commit;  

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

     CUST   PROD_A  PROD_B  PROD_C  PROD_D
-------------------------------------------
1 1 A B C
2 2 A B C D

--删除测试表和测试存储过程
--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);
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:10:09
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/6450/
本文WWW.DOC100.NET DOC100.NET版权所有。