PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Mesclar várias linhas em uma com mais de um valor de linha em uma coluna


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,