Oracle 11g má tuto elegantní funkci LISTAGG, která je v podstatě to, co chcete, ale protože máte 10 g, není vám k dispozici (pokud se nerozhodnete upgradovat).
Pokud si z nějakého důvodu nepřejete (nebo nemůžete z jakýchkoli důvodů) upgradovat na 11g, navrhoval bych podívat se na některé alternativy k LISTAGG, které máte k dispozici na 10g.
Můžete se podívat na některé z navrhovaných alternativ zde
Rychle upravit rychlou úpravu jedné z navrhovaných alternativ, aby odpovídala vašemu případu:
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;
Ale pamatujte, že toto není skutečné řešení, protože ho budete muset upravit podle vašeho stolu (ne falešného DUAL stolu) atd...
Vaše řešení bude pravděpodobně vypadat takto:
SELECT POD,
RTRIM(
XMLAGG (XMLELEMENT(E, NAME||',') ORDER BY NAME).EXTRACT('//text()'),
','
) AS NAME
FROM tbl1
GROUP BY POD;
Pokud chcete změnit oddělovač, můžete jej změnit z čárky v této části:
(E, NAME||',')
RTRIM slouží pouze k odstřižení koncové čárky z konce zřetězeného řetězce. Pokud vás koncová čárka neobtěžuje, můžete funkci RTRIM vynechat, abyste zachovali čitelnost.