Oracle 11g heeft deze handige functie LISTAGG die ongeveer is wat u wilt, maar aangezien u 10g gebruikt, is dit niet voor u beschikbaar (tenzij u besluit te upgraden).
Als je om wat voor reden dan ook niet wilt (of om welke reden dan ook niet kunt) upgraden naar 11g, raad ik je aan om een aantal alternatieven voor LISTAGG te bekijken die voor jou beschikbaar zijn op 10g.
U kunt enkele van de voorgestelde alternatieven bekijken hier
Snel een snelle aanpassing van een van de voorgestelde alternatieven aangepast aan uw casusscenario:
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;
Maar onthoud dat dit niet de daadwerkelijke oplossing is, omdat u deze moet aanpassen aan uw tafel (niet de dummy DUAL-tabel) enz...
Uw oplossing ziet er waarschijnlijk ongeveer zo uit:
SELECT POD,
RTRIM(
XMLAGG (XMLELEMENT(E, NAME||',') ORDER BY NAME).EXTRACT('//text()'),
','
) AS NAME
FROM tbl1
GROUP BY POD;
Als u het scheidingsteken wilt wijzigen, kunt u dit in dit gedeelte door komma's wijzigen:
(E, NAME||',')
De RTRIM is er alleen om de volgkomma van het einde van de aaneengeschakelde tekenreeks af te knippen. Als je geen last hebt van de volgkomma, kun je de RTRIM-functie weglaten om de leesbaarheid te behouden.