Oracle 11g ma tę fajną funkcję LITAGG, która jest prawie tym, czego chcesz, jednak ponieważ korzystasz z 10g, nie jest to dla ciebie dostępne (chyba że zdecydujesz się na uaktualnienie).
Jeśli z jakiegoś powodu nie chcesz (lub z jakichkolwiek powodów nie możesz) uaktualnić do 11g, sugeruję przyjrzenie się alternatywom dla LITAGG, które są dostępne na 10g.
Możesz sprawdzić niektóre z proponowanych alternatyw tutaj
Szybko dostosować szybką adaptację jednej z proponowanych alternatyw, aby dopasować ją do scenariusza przypadku:
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;
Pamiętaj jednak, że nie jest to właściwe rozwiązanie, ponieważ będziesz musiał dostosować je do swojego stołu (nie do fikcyjnego stołu DUAL) itp...
Twoje rozwiązanie prawdopodobnie będzie wyglądać mniej więcej tak:
SELECT POD,
RTRIM(
XMLAGG (XMLELEMENT(E, NAME||',') ORDER BY NAME).EXTRACT('//text()'),
','
) AS NAME
FROM tbl1
GROUP BY POD;
Jeśli chcesz zmienić ogranicznik, możesz zmienić go z przecinka w tej części:
(E, NAME||',')
RTRIM służy tylko do odcięcia końcowego przecinka z końca połączonego ciągu, jeśli nie przeszkadza ci końcowy przecinek, możesz pominąć funkcję RTRIM, aby zachować czytelność.