能否自己写一个类似sum的函数用法也一样,这个函数是sumstr()里面传的字段类型为varchar2,功能是把分组中的字符串用逗号连成串eg.
select a,b from t
a b
- -
1 a1
1 a1
2 b2
2 b3select a,sumstr(b) b from t
a b
- -
1 a1,a2
2 b2,b3
select a,b from t
a b
- -
1 a1
1 a1
2 b2
2 b3select a,sumstr(b) b from t
a b
- -
1 a1,a2
2 b2,b3
大家帮忙了!!!
8i里没有sys_connect_by_path,你说的sumstr函数不知道怎么做,学习。
如
c1 c2
--------------
1 我
1 是
1 谁
2 知
2 道
3 不
……
转换为
1 我是谁
2 知道
3 不
这一类型的转换必须借助于PL/SQL来完成,这里给一个例子
CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER)
RETURN VARCHAR2
IS
Col_c2 VARCHAR2(4000);
BEGIN
FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
Col_c2 := Col_c2||cur.c2;
END LOOP;
Col_c2 := rtrim(Col_c2,1);
RETURN Col_c2;
END;
/
SQL> select distinct c1 ,get_c2(c1) cc2 from table;即可
FUNCTION GET_C2 (
tmp_c1 NUMBER, --第一列字段值
col_c1 VARCHAR2, --第一列字段名
col_c2 VARCHAR2, --第二列字段名
tab_name VARCHAR2 --表名
)
RETURN VARCHAR2
IS
type rc is ref cursor;
cur rc;
strsql VARCHAR2 (4000);
col_tmp VARCHAR2 (4000);
col_c VARCHAR2 (4000);
BEGIN
strsql :=
'select '
|| col_c2
|| ' from '
|| tab_name
|| ' where '
|| col_c1
|| '='
|| tmp_c1; open cur for strsql;
LOOP
fetch cur into col_tmp;
exit when cur%notfound;
col_c := col_c || ',' || col_tmp;
END LOOP;
col_c := substr(col_c, 2,length(col_c));
RETURN col_c;
END;
缺点:参数太多,调用起来麻烦。像楼主说的只用一个参数的那种不知道怎么写。
在函数里用动态Sql