Do seu estado atual, você simplesmente pode fazer o pivô usando o
FILTER
cláusula:demo:db<>fiddle
SELECT
response,
document,
MAX(bill) FILTER (WHERE label = 'bill') as bill,
MAX(answer) FILTER (WHERE label = 'amount') as amount,
MAX(product) FILTER (WHERE label = 'product') as product,
MAX(answer) FILTER (WHERE label = 'price') as price
FROM t
GROUP BY response, document
Não tenho certeza, como sua tabela original se parece. Se for mais assim:
response | document | label | value
-------: | -------: | :------ | :----
71788176 | 79907201 | bill | 26899
71788176 | 79907201 | amount | 1
71788176 | 79907201 | product | shoes
71788176 | 79907201 | price | 25.99
Então você pode modificar a consulta assim:
demo:db<>fiddle
SELECT
response,
document,
MAX(value) FILTER (WHERE label = 'bill') as bill,
MAX(value) FILTER (WHERE label = 'amount') as amount,
MAX(value) FILTER (WHERE label = 'product') as product,
MAX(value) FILTER (WHERE label = 'price') as price
FROM t
GROUP BY response, document
Editar :TO adicionou o valor JSON à coluna do produto:
demo:db<>fiddle
Variante 1:você pode simplesmente converter o tipo
json
digite text
:MAX(product::text) FILTER (WHERE label = 'product') as product,
Variante 2:você lê o valor do
"name"
atributo:MAX(product ->> 'name') FILTER (WHERE label = 'product') as product,