2011-08-03 2 views
5

Oracle PIVOT句でユーザー定義集計関数を使用できません。Oracle PIVOT句のユーザー定義集計関数

私はstring_aggというユーザ定義の集計関数を作成しました。私は

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));

は私が手ピボット句に次のように同じ機能を使用しようとただし
ID TYPE STRING_AGG(VALUE) 
user1  CAR    Audi,BMW 
user1  COMPUTER  Dell,Sony 
user2  CAR    Honda 
user2  COMPUTER  HP 

:私はのような簡単な文でそれを使用することができる午前
...で
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

結果エラー...
ORA-56902: expect aggregate function inside pivot operation

期待結果は...

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

"select id、string_agg(value)from table1"は、group by句を持たないため、ORA-00937エラーが発生します。ピボットを持ついくつかのSQLの完全な例を教えてください。あなたの集約関数は失敗します。 – Gerrat

+0

フィードバックいただきありがとうございます。詳細な例を提供する編集オリジナルの投稿 – nick

+0

ここからstring_agg関数を使用しているようです:http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php。私はこれが失敗する理由を見つけることができません。多分バグかもしれません(おそらく、ピボットはユーザー定義の集計関数では機能しません)? string_aggの2回目の出現を 'max'に変更した場合は、 – Gerrat

答えて

0

ピボットは同じ集約関数上である必要はありません。

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

何wmsys.wm_concatを試みる代わりに、ユーザー定義の集約については?

+0

私は明らかにすべきだった...デモは非常に簡単です - 私は後に何を私は数値や文字列を渡すことができる関数であり、それは合計か連結を計算する必要があるかどうかを決定する – nick

関連する問題