假如已经有表
产品   用户  
1      a
2      b
3      c 
..     ..
100    n
要创建表如下;
用户  1   2   3   4   ....  100
a     1   0
b     0   1
c     ...
..
n
也就是要创建一个表,统计用户拥有哪些产品,有就输入1,没有就输入0可是因为列数太多了,所以一列列去alter很麻烦,有没有办法自动生成列,并且通过pl/sql实现自动统计用户是否拥有产品呢?求教!公司的人出来考我的问题,很遗憾看了一段时间的Oracle,感觉用于这种实际的操作,还是完全没有思路

解决方案 »

  1.   

    行转列问题:写一个存储过程并动态拼接SQL就行了
    随便写了一个,未调式
    CREATE OR REPLACE PROCEDURE row2col(o OUT SYS_REFCURSOR) IS
      sqlstr VARCHAR2(32760) := '';
    BEGIN
      FOR cc IN (SELECT distinct 产品 FROM t_table) LOOP
        sqlstr := sqlstr || 'sum(decode(产品,''' || cc.产品 ||''',1)) as "产品_' 
                         || cc.产品 || '",';
      END LOOP;
      sqlstr := 'create table t_newtable as select 用户,' || rtrim(sqlstr,',') || ' from t_table group by 用户';
      execute immediate sqlstr;
    END row2col;
      

  2.   

    谢谢 tangren的指教但是我按照这个模式,
    CREATE OR REPLACE PROCEDURE P_pcoo1 IS
    V_SQL VARCHAR2(32760);
    CURSOR CURSOR_1 IS SELECT DISTINCT p.prod_id FROM pcoo p ORDER BY prod_id;
    BEGIN
    V_SQL := 'SELECT cust_id';
    FOR V_prod_id IN CURSOR_1
    LOOP
    V_SQL := V_SQL || ',' || 'SUM(DECODE(prod_id,''' || V_prod_id.prod_id ||
    ''',sign(cust_id),0)) AS ' || V_prod_id.prod_id;
    END LOOP;V_SQL := V_SQL || ' FROM pcoo GROUP BY cust_id ORDER BY cust_id';
    V_SQL := 'CREATE OR REPLACE VIEW RESULT  AS '||  V_SQL;
    EXECUTE IMMEDIATE V_SQL;
    END;出现这个错误
    ORA-00923: 未找到要求的 FROM 关键字
    ORA-06512: 在 "SYS.P_PCOO1", line 14
    ORA-06512: 在 line 3
    但是我实在是找不出来这个过程哪里出错了,为什么会找不到from关键字?有没有高手能再指点一下吗?
      

  3.   

    郁闷死,把AS换成as就可以顺利执行了,太无语了