Để tổng hợp thông qua một giá trị, giá trị phải có thể sắp xếp / có thể băm, nghĩa là hai giá trị bất kỳ phải có thể so sánh được (để được sắp xếp / băm). XMLType
không thể sắp xếp / băm được. Một đối tượng / lớp trong Oracle có thể băm / có thể sắp xếp khi nó có một trong các hàm đặc biệt map
hoặc order
được xác định. Xem tài liệu Oracle tương ứng
.
Bạn đang tổng hợp qua xcol
, là một XMLType
giá trị. Vì vậy, cách giải quyết vấn đề của bạn sẽ được tổng hợp thông qua một thứ khác.
Dựa trên thông tin hỗn loạn mà bạn đang cung cấp cho chúng tôi, tôi nghĩ đến hai giải pháp ...
Giải pháp 1
WITH xdata AS
(SELECT 1 AS a_id,
xmltype ('<a>
<b>
<b_id>1</b_id>
<val>2</val>
</b>
<b>
<b_id>1</b_id>
<val>3</val>
</b>
</a>') AS xcol
FROM DUAL
UNION ALL
SELECT 2 AS a_id,
xmltype ('<a>
<b>
<b_id>3</b_id>
<val>5</val>
</b>
<b>
<b_id>4</b_id>
<val>4</val>
</b>
</a>') AS xcol
FROM DUAL)
SELECT a_id,
sum(XMLCAST (
XMLQUERY ('sum($doc/a/b/val)'
PASSING xcol AS "doc" RETURNING CONTENT) AS INTEGER))
b_val
FROM xdata
group by a_id;
Giải pháp 2
WITH xdata AS
(SELECT 1 AS a_id,
xmltype ('<a>
<b>
<b_id>1</b_id>
<val>2</val>
</b>
<b>
<b_id>1</b_id>
<val>3</val>
</b>
</a>') AS xcol
FROM DUAL
UNION ALL
SELECT 2 AS a_id,
xmltype ('<a>
<b>
<b_id>3</b_id>
<val>5</val>
</b>
<b>
<b_id>4</b_id>
<val>4</val>
</b>
</a>') AS xcol
FROM DUAL)
select X.a_id, sum(Y.b_val) as b_val
from xdata X
cross join xmltable(
'/a/b'
passing X.xcol
columns
b_val integer path 'val'
) Y
group by X.a_id;