PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Unisci più righe in una con più di un valore di riga in una colonna

Dal tuo stato attuale puoi semplicemente fare il pivot usando il FILTER clausola:

demo:db<>violino

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

Non sono del tutto sicuro di come sia il tuo tavolo originale. Se è più così:

response | document | label   | value
-------: | -------: | :------ | :----
71788176 | 79907201 | bill    | 26899
71788176 | 79907201 | amount  | 1    
71788176 | 79907201 | product | shoes
71788176 | 79907201 | price   | 25.99

Quindi puoi modificare la query in questo modo:

demo:db<>violino

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

Modifica :TO ha aggiunto il valore JSON alla colonna del prodotto:

demo:db<>violino

Variante 1:puoi semplicemente eseguire il cast del tipo json nel digitare text :

MAX(product::text) FILTER (WHERE label = 'product') as product,

Variante 2:leggi il valore dal "name" attributo:

MAX(product ->> 'name') FILTER (WHERE label = 'product') as product,