PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Fusionner plusieurs lignes en une seule avec plus d'une valeur de ligne dans une colonne

À partir de votre état actuel, vous pouvez simplement faire le pivot en utilisant le FILTER clause :

démo :db<>violon

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

Je ne sais pas trop à quoi ressemble votre table d'origine. Si c'est plutôt comme ça :

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

Ensuite, vous pouvez modifier la requête comme ceci :

démo :db<>violon

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

Modifier  :TO a ajouté la valeur JSON à la colonne produit :

démo :db<>violon

Variante 1 :vous pouvez simplement convertir le type json dans le type text :

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

Variante 2 :vous lisez la valeur à partir du "name" attribut :

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