Om via een waarde te kunnen aggregeren, moet de waarde sorteerbaar/hashbaar zijn op, wat betekent dat twee waarden vergelijkbaar moeten zijn (om te kunnen worden gesorteerd/gehasht). XMLType
is niet sorteerbaar/hashbaar. Een object/klasse in Oracle is hashbaar/sorteerbaar als het een van de speciale functies heeft map
of order
bepaald. Zie de respectievelijke Oracle-documentatie
.
Je aggregeert via xcol
, wat een XMLType
. is waarde. Dus een oplossing voor uw probleem zou zijn om via iets anders te verzamelen.
Op basis van de chaotische informatie die je ons geeft, komen er twee oplossingen in me op ...
Oplossing 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;
Oplossing 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;