値を介して集計するには、値が並べ替え可能/ハッシュ可能である必要があります。つまり、任意の2つの値が比較可能である必要があります(並べ替え/ハッシュ化するため)。 XMLType
ソート可能/ハッシュ可能ではありません。 Oracleのオブジェクト/クラスは、特別な関数map
のいずれかを持っている場合、ハッシュ可能/ソート可能です。 またはorder
定義されています。 それぞれのOracleドキュメント
を参照してください。 。
xcol
を介して集計しています 、これはXMLType
価値。したがって、問題の解決策は、他の何かを介して集約することです。
あなたが私たちに提供している混沌とした情報に基づいて、2つの解決策が私の頭に浮かびます...
ソリューション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;