2015-07-27 20:25 GMT-03:00 Stclara <[email protected]>:
> Gostaria de saber se alguém já recebeu um pedido destes e como conseguiu
> resolver:
> - Uma tabela com os campos nome e cores;
> - Ex:
> nome cores
> carlos azul, vermelho, amarelo
> josé branco, cinza, azul
> antonio amarelo, azul, roxo
>
> - Agora preciso montar uma consulta que me retorne:
>
> azul vermelho amarelo branco cinza roxo
> carlos carlos carlos josé josé antonio
> josé antonio
> antonio
>
Tem várias formas, isso é semelhante com conceito de PIVOT ou crosstab. O
problema maior no seu caso é que não tem uma grupo claro. Se você estiver
usando versão 9.4 ou superior, então eu penso na seguinte solução (não sei
dizer se a melhor):
CREATE TEMP TABLE foo(nome text, cor text);
INSERT INTO foo VALUES('carlos', 'azul'),('carlos',
'vermelho'),('carlos', 'amarelo'),('josé',
'branco'),('josé','cinza'),('josé','azul'),('antonio','amarelo'),('antonio','azul'),('antonio','roxo');
WITH nomes AS (
SELECT
array_agg(nome) FILTER(WHERE cor = 'azul') AS azul,
array_agg(nome) FILTER(WHERE cor = 'vermelho') AS vermelho
FROM foo
)
SELECT u.* FROM nomes n, unnest(n.azul, n.vermelho) AS u(azul,
vermelho);
Essa consulta usa duas novidades da versão 9.4, primeiro usa o FILTER para
agregar em arrays os nomes que estão em cada cor, depois usa o unnest com
dois parâmetros (unnest com mais de um parâmetro é da 9.4) que já traz o
resultado exatamente como você espera.
Fiz somente para vermelho e azul, mas é só expandir para as demais cores.
Atenciosamente,
--
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral