我有一个名为ConcatList的聚合函数,它将值列表连接成一个逗号分隔值。
这是我想要做的一个例子。我有两个表:员工和工作。工作是员工的“孩子”。我需要获得一份员工列表,其中包括以逗号分隔的与员工相关的工作列表,并按工作名称排序。
我以为我可以这样做:
select em.EmployeeId,
em.EmployeeName,
(select ConcatList(jo.JobName)
from Job jo
where jo.EmployeeId = em.EmployeeId
order by jo.JobName)
from Employee em;
但是,这会在“order by”子句中返回以下错误:
ORA-00907: missing right parenthesis
如果我摆脱了“order by”子句,这个SQL可行,但我需要对作业列表进行排序。
我该如何做到这一点?
答案 0 :(得分:2)
您可以对已连接的记录进行排序,然后汇总结果:
select EmployeeId,
EmployeeName,
ConcatList(JobName)
from (
select em.EmployeeId,
em.EmployeeName,
jo.JobName
from Employee em
join Job jo
on jo.EmployeeId = em.EmployeeId
order by jo.JobName
)
group by EmployeeId,
EmployeeName
答案 1 :(得分:1)
由于ConcatList
是用户定义的聚合函数,因此修改ConcatList
以对结果进行排序或创建用于对数据进行排序的ConcatSortedList
聚合函数似乎是有意义的它聚合。加里迈尔斯有一个user-defined aggregate function that produces a sorted list的例子。
您还可以浏览Tim Hall网站上的各种string aggregation techniques。如果必须生成排序列表,则使用其中许多技术比尝试保证非排序用户定义的聚合函数生成排序结果更容易。例如,generic function taking a REF CURSOR在需要排序时相对容易使用,因为您只需向游标添加ORDER BY
即可。
答案 2 :(得分:0)
select em.EmployeeId,
em.EmployeeName,
wm_concat(jo.JobName) over
(partion by jo.EmployeeID order by JobName) as JobList
from Employee em
INNER JOIN JOB JO on jo.EmployeeId = em.EmployeeId
我意识到wm_concat是一个分析的例子 - > http://www.tek-tips.com/viewthread.cfm?qid=1629662
Text2 =随机文字
val =分组
Select val, text2, wm_concat(text2) over (partition by val order by text2) as out_text2
from B
Test results:
VAL text2 out_Text2
1 XXX010105 (CLOB) XXX010105
1 something XXX010101 somet (CLOB) XXX010105,...
2 yet another XXX010102 and (CLOB) yet anothe...
4 XXX010103 (CLOB) XXX010103
5 a (CLOB) a
5 b (CLOB) a,b
5 c (CLOB) a,b,c
5 x (CLOB) a,b,c,x
6 a (CLOB) a
6 g (CLOB) a,g
6 i (CLOB) a,g,i
6 n (CLOB) a,g,i,n
6 x (CLOB) a,g,i,n,x