有人问这样的sql该怎么实现:
表数据和结构
CODE NAME B01 S01 B02 S02
1 张三 数学 80
1 张三 语文 75
2 王五 数学 70
2 王五
3 李四 数学 50
3 李四 语文 88
希望查询出如下结果:
CODE SUM_STR(NAME) B01 SUM_STR(S01) B02 SUM_STR(S02)
1 张三 数学 80 语文 75
2 王五 数学 70
3 李四 数学 50 语文 88
这个问题可以采用自定义的聚集函数来实现:
create
or
replace
type strcat_type
as
object (
cat_string
varchar2
(
4000
),
static
function
ODCIAggregateInitialize(cs_ctx
In
Out strcat_type)
return
number
,
member
function
ODCIAggregateIterate(self
In
Out strcat_type,value
in
varchar2
)
return
number
,
member
function
ODCIAggregateMerge(self
In
Out strcat_type,ctx2
In
Out strcat_type)
return
number
,
member
function
ODCIAggregateTerminate(self
In
Out strcat_type,returnValue Out
varchar2
,flags
in
number
)
return
number
)
/
------------------------------------
create
or
replace
type body strcat_type
is
static
function
ODCIAggregateInitialize(cs_ctx
IN
OUT strcat_type)
return
number
is
begin
cs_ctx :
=
strcat_type(
null
);
return
ODCIConst.Success;
end
;
member
function
ODCIAggregateIterate(self
IN
OUT strcat_type,
value
IN
varchar2
)
return
number
is
begin
if
self.cat_string
is
null
then
self.cat_string :
=
value;
end
if
;
return
ODCIConst.Success;
end
;
member
function
ODCIAggregateTerminate(self
IN
Out strcat_type,
returnValue OUT
varchar2
,
flags
IN
number
)
return
number
is
begin
returnValue :
=
self.cat_string;
return
ODCIConst.Success;
end
;
member
function
ODCIAggregateMerge(self
IN
OUT strcat_type,
ctx2
IN
Out strcat_type)
return
number
is
begin
if self.cat_string is null then
self.cat_string := ctx2.cat_string;
end if;
return
ODCIConst.Success;
end
;
end
;
/
-------------------
CREATE
OR
REPLACE
FUNCTION
sum_str(input
varchar2
)
RETURN
varchar2
PARALLEL_ENABLE AGGREGATE USING strcat_type;
/
-------最后查询语句:
select
code,sum_str(name), sum_str(b01) b01,sum_str(s01) ,sum_str(b02) b02,sum_str(s02)
from
javaeye
group
by
code
order
by
code
posted @
2009-01-05 21:55 kebo 阅读(967) |
评论 (4) |
编辑 收藏