员工表的记录在每个部门中保留一行。因此,您可以使用聚合功能以及按部门分组。在Oracle SQL中创建逗号分隔字符串的聚合函数是listag,但您当然可以编写自己的。LSTAGG完全按照我的要求执行,但它返回一个VARCHAR。我的数据太长,因此需要返回C
员工表的记录在每个部门中保留一行。因此,您可以使用聚合功能以及按部门分组。在Oracle SQL中创建逗号分隔字符串的聚合函数是listag,但您当然可以编写自己的。LSTAGG完全按照我的要求执行,但它返回一个VARCHAR。我的数据太长,因此需要返回C,sql,oracle,function,oracle11g,Sql,Oracle,Function,Oracle11g,员工表的记录在每个部门中保留一行。因此,您可以使用聚合功能以及按部门分组。在Oracle SQL中创建逗号分隔字符串的聚合函数是listag,但您当然可以编写自己的。LSTAGG完全按照我的要求执行,但它返回一个VARCHAR。我的数据太长,因此需要返回CLOB select * from v$version; BANNER ---------------------------------------------------------------------------- Oracle D
员工表的记录在每个部门中保留一行。因此,您可以使用聚合功能以及
按部门分组
。在Oracle SQL中创建逗号分隔字符串的聚合函数是listag
,但您当然可以编写自己的。LSTAGG完全按照我的要求执行,但它返回一个VARCHAR。我的数据太长,因此需要返回CLOB
select * from v$version;
BANNER
----------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
I know there are numerous ways of aggregating strings.
My needs are somewhat unique of please do not suggest alternate approaches.
I believe the following should work but it does not
CREATE OR REPLACE TYPE t_clob_agg_comma AS OBJECT
(
g_string clob,
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_clob_agg_comma)
RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_clob_agg_comma,
value IN VARCHAR2 )
RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate(self IN t_clob_agg_comma,
returnValue OUT VARCHAR2,
flags IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate(self IN t_clob_agg_comma,
returnValue OUT CLOB,
flags IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_clob_agg_comma,
ctx2 IN t_clob_agg_comma)
RETURN NUMBER
);
/
show errors
CREATE OR REPLACE TYPE BODY t_clob_agg_comma IS
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_clob_agg_comma)
RETURN NUMBER IS
BEGIN
sctx := t_clob_agg_comma(NULL);
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_clob_agg_comma,
value IN VARCHAR2)
RETURN NUMBER IS
BEGIN
SELF.g_string := self.g_string || ',' || value;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateTerminate(self IN t_clob_agg_comma,
returnValue OUT VARCHAR2,
flags IN NUMBER)
RETURN NUMBER IS
BEGIN
returnValue := RTRIM(LTRIM(SELF.g_string, ','), ',');
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateTerminate(self IN t_clob_agg_comma,
returnValue OUT CLOB,
flags IN NUMBER)
RETURN NUMBER IS
BEGIN
returnValue := RTRIM(LTRIM(SELF.g_string, ','), ',');
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_clob_agg_comma,
ctx2 IN t_clob_agg_comma)
RETURN NUMBER IS
BEGIN
SELF.g_string := SELF.g_string || ',' || ctx2.g_string;
RETURN ODCIConst.Success;
END;
END;
/
show error
CREATE OR REPLACE FUNCTION clob_agg (p_input VARCHAR2)
RETURN clob
PARALLEL_ENABLE AGGREGATE USING t_clob_agg_comma;
/
SHOW ERRORS
SELECT department_id, clob_agg(last_name) over(order by last_name) AS employees
FROM demo.employee
group by department_id;
--SELECT department_id, clob_agg(last_name) over(order by last_name) AS employees *
--ERROR at line 1:
--ORA-00979: not a GROUP BY expression
SELECT department_id, clob_agg(last_name) within group order by last_name AS employees
FROM demo.employee
group by department_id;
SELECT department_id, clob_agg(last_name) over(partition by department_id) AS employees
FROM demo.employee
group by department_id;
--SELECT department_id, clob_agg(last_name) within group order by last_name AS employees -- *
--ERROR at line 1:
--ORA-00923: FROM keyword not found where expected
SELECT department_id, clob_agg(last_name) over(partition by department_id order by last_name) AS employees
FROM demo.employee;
SELECT department_id, clob_agg(last_name) over(partition by department_id order by last_name) AS employees
FROM demo.employee
group by department_id;
--SELECT department_id, clob_agg(last_name) over(partition by department_id order by last_name) AS
-- *
--ERROR at line 1:
--ORA-00979: not a GROUP BY expression
SELECT clob_agg(last_name) AS employees
FROM demo.employee
group by department_id;
SELECT department_id, clob_agg(last_name) AS employees
FROM demo.employee
group by department_id;
--does not sort, does not return department_id
SELECT clob_agg(last_name) AS employees
FROM demo.employee
group by department_id;
--does not sort
SELECT department_id, clob_agg(last_name) AS employees
FROM demo.employee
group by department_id;
select name, salary from employee;
select avg(salary) from employee;
select department, avg(salary) from employee group by department;
select name, salary, avg(salary) over () from employee;
select name, salary, avg(salary) over (partition by department) from employee;
select department, avg(salary), min(avg(salary)) over ()
from employee
group by department;