Wymored Login

consulta crosstab ou pivot em postgresql

23 de janeiro de 2019 por Alexandre Miguel de Andrade Souza

1) adicione a extensão:

CREATE EXTENSION IF NOT EXISTS tablefunc;

2) Agora a consulta:

SELECT *
FROM crosstab(
    'select id, nota, count(a.id)
from atrativo at, avaliacao a
where at.id = a.atrativo
group by 1,2
order by 1,2 desc '

, $$SELECT unnest('{5,4,3,2,1}'::text[])$$

) AS ct("id" int, "excelente" int, "bom" int, "regular" int, "ruim" int, "pessimo" int);

Note que 5,4,3,2,1 são os valores da coluna nota e "excelente" int, "bom" int, "regular" int, "ruim" int, "pessimo" int são os nomes das respectivas colunas no resultado.

Uma versão que relaciona o resultado com outra tabela:

with pivot as ( SELECT *
    FROM crosstab(
        'select at.id , nota, count(a.id)
    from atrativo at, avaliacao a
    where at.id = a.atrativo
    group by 1,2
    order by 1,2 desc '

    , $$SELECT unnest('{5,4,3,2,1}'::text[])$$

    ) AS ct("id" int, "excelente" int, "bom" int, "regular" int, "ruim" int, "pessimo" int)
    )

select a.id, a.nome, excelente,bom,regular,ruim,pessimo
from atrativo a, pivot p
where a.id = p.id