Use
crosstab()
do módulo adicional tablefunc. A dificuldade específica aqui é que o "nome da linha" consiste em duas colunas. Eu concateno para o propósito da consulta e não mostro a coluna concatenada no final.
Assumindo
fn
e ln
são NOT NULL
. Não testado:SELECT fn, ln, cat1, cat2
FROM crosstab(
'SELECT fn || ln AS row_name, fn, ln, file_type, attribute
FROM t
ORDER BY fn, ln, file_type'
,$$VALUES ('cat1'::text), ('cat2')$$)
AS t (row_name text, fn text, ln int, cat1 text, cat2 text);
Outra opção seria adicionar um "nome de linha" substituto com uma função de janela como
dense_rank()
e trate as duas colunas definidoras como "colunas extras". Exemplo:- Consulta de tabela cruzada Postgresql com várias colunas "nome da linha"
Fundamentos:
- Consulta de tabela cruzada PostgreSQL