2015-07-27 20:25 GMT-03:00 Stclara <stcl...@gmail.com>:

> 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
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a