Untuk mengagregasi melalui suatu nilai, nilainya harus dapat diurutkan/dapat di-hash, artinya dua nilai harus sebanding (agar dapat diurutkan/di-hash). XMLType
tidak dapat diurutkan/hashable. Objek/kelas di Oracle dapat di-hash/disortir ketika memiliki salah satu fungsi khusus map
atau order
didefinisikan. Lihat dokumentasi Oracle masing-masing
.
Anda menggabungkan melalui xcol
, yang merupakan XMLType
nilai. Jadi, penyelesaian masalah Anda adalah dengan menggabungkannya melalui sesuatu yang lain.
Berdasarkan info kacau yang Anda berikan kepada kami, dua solusi muncul di benak saya ...
Solusi 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;
Solusi 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;