SQL - Vários valores separados por vírgula ao usar GROUP BY [duplicado]
Pergunta
Esta questão já tem uma resposta aqui:
Eu tenho dados que se parece com
CUSTOMER, CUSTOMER_ID, PRODUCT ABC INC 1 XYX ABC INC 1 ZZZ DEF CO 2 XYX DEF CO 2 ZZZ DEF CO 2 WWW GHI LLC 3 ZYX
Eu gostaria de escrever uma consulta que faria o olhar de dados como este:
CUSTOMER, CUSTOMER_ID, PRODUCTS ABC INC 1 XYX, ZZZ DEF CO 2 XYX, ZZZ, WWW GHI LLC 3 ZYX
Usando o Oracle 10g se ajuda. Eu vi algo que iria trabalhar usando o MySQL, mas eu preciso de um SQL simples ou ORACLE equivalente. Eu também vi exemplos de procedimentos armazenados que poderiam ser feitas, no entanto, eu não posso usar um proc armazenados com o produto que estou usando.
Aqui está Como foi trabalhar em MySQL se eu fosse usá-lo
SELECT CUSTOMER,
CUSTOMER_ID,
GROUP_CONCAT( PRODUCT )
FROM MAGIC_TABLE
GROUP BY CUSTOMER, CUSTOMER_ID
Obrigado.
Solução
Este link refere-se a uma série de exemplos de formas diferentes para fazer isso em Oracle. Veja se há algo lá que você tem permissões em seu banco de dados para fazer.
Outras dicas
Eu acho LISTAGG é o melhor grupo agregado pela função para uso nesta situação:
SELECT CUSTOMER, CUSTOMER_ID,
LISTAGG(PRODUCT, ', ') WITHIN GROUP (ORDER BY PRODUCT)
FROM SOME_TABLE
GROUP BY CUSTOMER, CUSTOMER_ID
ORDER BY 1, 2
A função de usuário oracle 'wm_concat' funciona da mesma maneira como LISTAGG exceto que você não pode especificar um delimitador '' por padrão ou uma ordem de classificação. No entanto, é compatível com 10g.
Graças Nigel,
My SQL não é tão elegante como poderia ser, mas eu precisava de uma solução que exigiu SQL apenas, não PLSQL ou TSQL, por isso acabou por olhar como esta:
SELECT CUSTOMER, CUSTOMER_ID, COUNT(PRODUCT) PROD_COUNT,
RTRIM(
XMLAGG( XMLELEMENT (C, PRODUCT || ',') ORDER BY PRODUCT
).EXTRACT ('//text()'), ','
) AS PRODUCTS FROM (
SELECT DISTINCT CUSTOMER, CUSTOMER_ID, PRODUCT
FROM MAGIC_TABLE
) GROUP BY CUSTOMER, CUSTOMER_ID ORDER BY 1 , 2
Ainda não sei exatamente o que as funções XML fazer exatamente, mas eu vou cavar quando o arrises necessidade.