За да се агрегира чрез стойност, стойността трябва да може да се сортира/хешира по, което означава, че всеки две стойности трябва да бъдат сравними (за да бъдат сортирани/хеширани). XMLType
не може да се сортира/хешира. Обект/клас в Oracle може да се хешира/сортира, когато има една от специалните функции map
или order
дефинирани. Вижте съответната документация на Oracle
.
Вие агрегирате чрез xcol
, което е XMLType
стойност. Така че решението на вашия проблем би било агрегиране чрез нещо друго.
Въз основа на хаотичната информация, която ни предоставяте, ми идват наум две решения...
Разтвор 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;
Решение 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;