写一个存储过程,对一张表的所有字段进行group by。表名是入参,也就是说,事先不知道这张表的字段名。
请问怎么才能实现group by呢?我知道可以把字段逐一赋给变量然后group by,但是,关键在于,
假设表中一共有5个字段,要group by以下任意2个字段,3个字段,4个字段,5个字段的组合。
主要是想实现字段组合的分组统计,如果不用group by可以解决的思路也行。

解决方案 »

  1.   

    CREATE OR REPLACE PROCEDURE p_groupby(i_tablename VARCHAR2,
                                          o           OUT SYS_REFCURSOR) AUTHID CURRENT_USER IS
      v_col_list VARCHAR2(2000);
      v_sql_str  VARCHAR2(2000);
    BEGIN
      EXECUTE IMMEDIATE 'select wm_concat(t.COLUMN_NAME) from user_tab_columns t where t.TABLE_NAME=upper(''' ||
                        i_tablename || ''')'
        INTO v_col_list;
      v_sql_str := 'select * from ' || i_tablename || ' group by cube(' ||
                   v_col_list || ')';
      OPEN o FOR v_sql_str;
    END;
    /SQL> select * from t;NAME               ID
    ---------- ----------
    aa                  1
    bb                  2
    cc                  3
    1                   4
    abc                 5
    SQL> var o refcursor;
    SQL> exec p_groupby('t',:o);PL/SQL 过程已成功完成。SQL> print oNAME               ID
    ---------- ----------                    1
                        2
                        3
                        4
                        5
    1
    1                   4
    aa
    aa                  1
    bbNAME               ID
    ---------- ----------
    bb                  2
    abc
    abc                 5
    cc
    cc                  3已选择16行。
      

  2.   

    要使用sum,count等来聚合字段,自己在此基础上改一下
      

  3.   

    是用动态语句执行啊,你的意思我明白,遇到的难题主要是在如何把自命名字赋给变量上。
    比如5个字段,对任意两个字段组合group by,就要
    用1字段逐一group by 2字段、3字段
    用2字段逐一 group by 3字段,4字段

    如果每个变量接收一个字段名,写一个循环group by怎么写?变量名不能运算,怎么指定用哪个变量?其实还想过取字段名后给每个字段添加唯一标识,那么写循环的时候就可以通过标识来取对应的字段名,只用一个变量接收字段名就行了。当时group by 的时候又需要使用到多个字段,那就需要多个变量