Oracle 11g में यह साफ-सुथरा कार्य LISTAGG है जो कि आप जो चाहते हैं वह बहुत अधिक है, हालाँकि जब से आप 10g पर हैं तो यह आपके लिए उपलब्ध नहीं है (जब तक कि आप अपग्रेड करने का निर्णय नहीं लेते)।
यदि किसी कारण से आप 11g में अपग्रेड नहीं करना चाहते (या किसी भी कारण से नहीं कर सकते हैं), तो मेरा सुझाव है कि LISTAGG के कुछ विकल्प देखें जो आपके लिए 10g पर उपलब्ध हैं।
आप कुछ प्रस्तावित विकल्पों की जांच कर सकते हैं यहां
अपने मामले के परिदृश्य से मेल खाने के लिए प्रस्तावित विकल्पों में से एक के त्वरित अनुकूलन को त्वरित रूप से समायोजित करें:
WITH Q AS
(
SELECT 'North' POD, 'Rony' NAME FROM DUAL UNION ALL
SELECT 'North', 'James' FROM DUAL UNION ALL
SELECT 'North', 'Aby' FROM DUAL UNION ALL
SELECT 'South', 'Sam' FROM DUAL UNION ALL
SELECT 'South', 'Willy' FROM DUAL UNION ALL
SELECT 'West', 'Mike' FROM DUAL
)
SELECT POD,
RTRIM(
XMLAGG (XMLELEMENT(e, name||',') ORDER BY name).EXTRACT('//text()'),
','
) AS name
FROM q
GROUP BY POD;
लेकिन याद रखें कि यह वास्तविक समाधान नहीं है क्योंकि आपको इसे अपनी तालिका के अनुसार तैयार करना होगा (डमी DUAL टेबल नहीं) आदि...
आपका समाधान शायद कुछ इस तरह दिखेगा:
SELECT POD,
RTRIM(
XMLAGG (XMLELEMENT(E, NAME||',') ORDER BY NAME).EXTRACT('//text()'),
','
) AS NAME
FROM tbl1
GROUP BY POD;
यदि आप सीमांकक को बदलना चाहते हैं तो आप इसे इस भाग में अल्पविराम से बदल सकते हैं:
(E, NAME||',')
RTRIM, संयोजित स्ट्रिंग के अंत से अनुगामी अल्पविराम को हटाने के लिए है, यदि आप अनुगामी अल्पविराम से परेशान नहीं हैं, तो आप पठनीयता को बनाए रखने के लिए RTRIM फ़ंक्शन को छोड़ सकते हैं।