À partir de votre état actuel, vous pouvez simplement faire le pivot en utilisant le FILTER
clause :
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 :
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 :
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,