2011-08-03 61 views
5

Không thể sử dụng các hàm tổng hợp do người dùng định nghĩa trong mệnh đề Oracle PIVOT.Các hàm tổng hợp do người dùng định nghĩa trong mệnh đề Oracle PIVOT

Tôi đã tạo hàm tổng hợp do người dùng xác định được gọi là string_agg.
tôi có thể sử dụng nó trong một tuyên bố đơn giản như ...

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

Kết quả trong:
ID TYPE STRING_AGG(VALUE) 
user1  CAR    Audi,BMW 
user1  COMPUTER  Dell,Sony 
user2  CAR    Honda 
user2  COMPUTER  HP 

Tuy nhiên khi tôi cố gắng sử dụng các chức năng tương tự trong một điều khoản trục
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));

tôi nhận được như sau lỗi ...
ORA-56902: expect aggregate function inside pivot operation

Dự kiến ​​ kết quả là ...

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

"id chọn, string_agg (giá trị) từ bảng 1" sẽ cung cấp lỗi ORA-00937 do bạn không có nhóm theo mệnh đề. Bạn có thể cho chúng tôi một ví dụ hoàn chỉnh về một số sql với trục xoay và hàm tổng hợp của bạn trong đó không thành công. – Gerrat

+0

Cảm ơn bạn đã phản hồi. Đã chỉnh sửa bài đăng gốc để cung cấp ví dụ chi tiết – nick

+0

Có vẻ như bạn đang sử dụng hàm string_agg từ đây: http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php. Tôi không thể tìm thấy lý do nào cho việc này thất bại. Có thể một lỗi (có thể trục không hoạt động với các hàm tổng hợp do người dùng xác định)? Nếu bạn thay đổi sự xuất hiện thứ 2 của string_agg thành 'max', nó cho kết quả bạn muốn mặc dù – Gerrat

Trả lời

0

Pivot không phải qua hàm tổng hợp tương tự:

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

Điều này không tạo ra cùng một đầu ra như chức năng string_agg tùy chỉnh của mình (nhưng nếu bạn thay đổi dòng chứa LISTAGG trở lại những gì OP có, nó vẫn hoạt động ... và tạo ra kết quả mong muốn). – Gerrat

+0

Đúng. Tôi cũng nghĩ về điều này. Chỉ muốn tìm hiểu lý do tại sao tôi không thể sử dụng chức năng tăng cường do người dùng định nghĩa trong PIVOT. – nick

0

gì về việc cố gắng wmsys.wm_concat thay vì tổng hợp người dùng định nghĩa của bạn?

+0

Tôi cần phải làm rõ ... bản demo rất đơn giản - những gì tôi sau là một chức năng mà tôi có thể vượt qua trong một số hoặc một chuỗi và nó xác định nếu nó cần tính toán tổng hoặc concat – nick

Các vấn đề liên quan