एक मूल्य के माध्यम से एकत्र करने के लिए, मान को क्रमबद्ध/हैश करने योग्य होना चाहिए, जिसका अर्थ है कि किन्हीं दो मानों को तुलनीय होना चाहिए (क्रमबद्ध/हैश किए जाने के लिए)। 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;