有人问这样的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 (
				create
				 
				or
				 
				replace
				 type strcat_type 
				as
				 object (
 cat_string 
				varchar2
				(
				4000
				),
    cat_string 
				varchar2
				(
				4000
				),
 static 
				function
				 ODCIAggregateInitialize(cs_ctx 
				In
				 Out strcat_type) 
				return
				 
				number
				,
    static 
				function
				 ODCIAggregateInitialize(cs_ctx 
				In
				 Out strcat_type) 
				return
				 
				number
				,
 member 
				function
				 ODCIAggregateIterate(self 
				In
				 Out strcat_type,value 
				in
				 
				varchar2
				) 
				return
    member 
				function
				 ODCIAggregateIterate(self 
				In
				 Out strcat_type,value 
				in
				 
				varchar2
				) 
				return
				 

 number
				,
				number
				,
 member 
				function
				 ODCIAggregateMerge(self 
				In
				 Out strcat_type,ctx2 
				In
				 Out strcat_type)
    member 
				function
				 ODCIAggregateMerge(self 
				In
				 Out strcat_type,ctx2 
				In
				 Out strcat_type) 

 return
				 
				number
				,
				return
				 
				number
				,
 member 
				function
				 ODCIAggregateTerminate(self 
				In
				 Out strcat_type,returnValue Out
    member 
				function
				 ODCIAggregateTerminate(self 
				In
				 Out strcat_type,returnValue Out 

 varchar2
				,flags 
				in
				 
				number
				) 
				return
				 
				number
				varchar2
				,flags 
				in
				 
				number
				) 
				return
				 
				number
				
						
						 )
)
 /
				/
				
						
						 
						
						 
				
		 
		
				
------------------------------------
		
				 create
				 
				or
				 
				replace
				 type body strcat_type 
				is
				create
				 
				or
				 
				replace
				 type body strcat_type 
				is
				
						
						 static 
				function
				 ODCIAggregateInitialize(cs_ctx 
				IN
				 OUT strcat_type) 
				return
				 
				number
  static 
				function
				 ODCIAggregateInitialize(cs_ctx 
				IN
				 OUT strcat_type) 
				return
				 
				number
				
						
						 is
  
				is
				
						
						 begin
  
				begin
				
						
						 cs_ctx :
				=
				 strcat_type( 
				null
				 );
      cs_ctx :
				=
				 strcat_type( 
				null
				 );
 return
				 ODCIConst.Success;
      
				return
				 ODCIConst.Success;
 end
				;
  
				end
				;

 member 
				function
				 ODCIAggregateIterate(self 
				IN
				 OUT strcat_type,
  member 
				function
				 ODCIAggregateIterate(self 
				IN
				 OUT strcat_type,
 value 
				IN
				 
				varchar2
				 )
                                       value 
				IN
				 
				varchar2
				 )
 return
				 
				number
  
				return
				 
				number
				
						
						 is
  
				is
				
						
						 begin
  
				begin
				
						
						 if
				 self.cat_string 
				is
				 
				null
				 
				then
      
				if
				 self.cat_string 
				is
				 
				null
				 
				then
				
						
						 self.cat_string :
				=
				 value;
         self.cat_string :
				=
				 value;
 end
				 
				if
				;
      
				end
				 
				if
				;
 return
				 ODCIConst.Success;
      
				return
				 ODCIConst.Success;
 end
				;
  
				end
				;

 member 
				function
				 ODCIAggregateTerminate(self 
				IN
				 Out strcat_type,
  member 
				function
				 ODCIAggregateTerminate(self 
				IN
				 Out strcat_type,
 returnValue OUT 
				varchar2
				,
                                         returnValue OUT 
				varchar2
				,
 flags 
				IN
				 
				number
				)
                                         flags 
				IN
				 
				number
				)
 return
				 
				number
  
				return
				 
				number
				
						
						 is
  
				is
				
						
						 begin
  
				begin
				
						
						 returnValue :
				=
				 self.cat_string;
      returnValue :
				=
				 self.cat_string;
 return
				 ODCIConst.Success;
      
				return
				 ODCIConst.Success;
 end
				;
  
				end
				;

 member 
				function
				 ODCIAggregateMerge(self 
				IN
				 OUT strcat_type,
  member 
				function
				 ODCIAggregateMerge(self 
				IN
				 OUT strcat_type,
 ctx2 
				IN
				 Out strcat_type)
                                     ctx2 
				IN
				 Out strcat_type)
 return
				 
				number
  
				return
				 
				number
				
						
						 is
  
				is
				
						
						 begin
  
				begin
				
						
						 if self.cat_string is null then
       if self.cat_string is null then 
                   self.cat_string :=  ctx2.cat_string;
          end if;
				
						 return
				 ODCIConst.Success;
      
				return
				 ODCIConst.Success;
 end
				;
  
				end
				;

 end
				;
				end
				;
 /
				/
				
						
						 
						
						 
				
		 
		-------------------
		
				 CREATE
				 
				OR
				 
				REPLACE
				 
				FUNCTION
				 sum_str(input 
				varchar2
				 )
				CREATE
				 
				OR
				 
				REPLACE
				 
				FUNCTION
				 sum_str(input 
				varchar2
				 )
 RETURN
				 
				varchar2
				RETURN
				 
				varchar2
				
						
						 PARALLEL_ENABLE AGGREGATE USING strcat_type;
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)
				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
				from
				 javaeye 
				group
				 
				by
				 code 
				order
				 
				by
				 code
		 
	posted on 2009-01-05 21:55 
kebo 阅读(995) 
评论(4)  编辑  收藏  所属分类: 
oracle