背着手扇扇子的人
往事随风......前事如梦......
posts - 35,  comments - 17,  trackbacks - 0

有人问这样的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 阅读(955) | 评论 (4)编辑 收藏

<2009年1月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(1)

随笔分类

随笔档案

文章档案

相册

收藏夹

朋友

搜索

  •  

积分与排名

  • 积分 - 22489
  • 排名 - 1607

最新评论

阅读排行榜

评论排行榜