2011-08-03 127 views
5

无法在Oracle PIVOT子句中使用用户定义的聚合函数。Oracle PIVOT子句中的用户定义聚合函数

我创建了一个名为string_agg的用户定义聚合函数。
我能够在一个简单的语句,如使用它...

select id, string_agg(value) from 
(
    select 'user1' as id, 'BMW' as value, 'CAR'  as type from dual union 
    select 'user1' as id, 'Audi' as value, 'CAR'  as type from dual union 
    select 'user2' as id, 'Honda' as value, 'CAR'  as type from dual union 
    select 'user1' as id, 'Dell' as value, 'COMPUTER' as type from dual union 
    select 'user1' as id, 'Sony' as value, 'COMPUTER' as type from dual union 
    select 'user2' as id, 'HP' as value, 'COMPUTER' as type from dual 
) 
group by id, type

结果:
ID TYPE STRING_AGG(VALUE) 
user1  CAR    Audi,BMW 
user1  COMPUTER  Dell,Sony 
user2  CAR    Honda 
user2  COMPUTER  HP 

然而,当我尝试使用相同的功能枢轴条款
select * from 
( 
    select id, type, string_agg(value) as value from 
    (
     select 'user1' as id, 'BMW' as value, 'CAR'  as type from dual union 
     select 'user1' as id, 'Audi' as value, 'CAR'  as type from dual union 
     select 'user2' as id, 'Honda' as value, 'CAR'  as type from dual union 
     select 'user1' as id, 'Dell' as value, 'COMPUTER' as type from dual union 
     select 'user1' as id, 'Sony' as value, 'COMPUTER' as type from dual union 
     select 'user2' as id, 'HP' as value, 'COMPUTER' as type from dual 
    ) 
    group by id, type 
) 
PIVOT (string_agg(value) FOR id IN ('user1' user1, 'user2' user2));

我得到以下错误...
ORA-56902: expect aggregate function inside pivot operation

预期结果是...

TYPE USER1 USER2 
COMPUTER Dell,Sony HP  
CAR   Audi,BMW Honda
+0

“select table,string_agg(value)from table1”将给出一个ORA-00937错误,因为您没有group by子句。你可以给我们一个完整的例子,一些与枢轴和你的聚合功能的SQL失败。 – Gerrat

+0

感谢您的反馈。编辑原始帖子以提供详细示例 – nick

+0

看起来您正在使用此处的string_agg函数:http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php。我找不到任何失败原因。也许一个bug(也许枢轴不适用于用户定义的聚合函数)?如果您将第二次出现的string_agg更改为“max”,它会给出您想要的结果,但 – Gerrat

回答

0

支点不必是在同一集合函数:

关于尝试wmsys.wm_concat,而不是你的用户定义的聚合
select * from 
( 
    select id, type, LISTAGG(value) WITHIN GROUP (ORDER BY 1) as value from 
    (
     select 'user1' as id, 'BMW' as value, 'CAR'  as type from dual union 
     select 'user1' as id, 'Audi' as value, 'CAR'  as type from dual union 
     select 'user2' as id, 'Honda' as value, 'CAR'  as type from dual union 
     select 'user1' as id, 'Dell' as value, 'COMPUTER' as type from dual union 
     select 'user1' as id, 'Sony' as value, 'COMPUTER' as type from dual union 
     select 'user2' as id, 'HP' as value, 'COMPUTER' as type from dual 
    ) 
    group by id, type 
) 
PIVOT (max(value) FOR id IN ('user1' user1, 'user2' user2)); 
+0

这不会产生与他自定义的string_agg函数相同的输出(但是,如果将包含LISTAGG的行更改回OP所具有的行,它仍然可以工作并生成所需的输出)。 – Gerrat

+0

是的。我也想到了这一点。只是想知道为什么我不能在PIVOT中使用用户定义的agg函数。 – nick

0

什么?

+0

我应该澄清...演示非常简单 - 我所追求的是一个函数,我可以传递一个数字或一个字符串,并确定它是否应该计算总和或concat – nick