PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Mehrere Zeilen mit mehr als einem Zeilenwert in einer Spalte zu einer zusammenführen

Von Ihrem aktuellen Stand aus können Sie den Pivot einfach mit dem FILTER durchführen Klausel:

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

Ich bin mir nicht ganz sicher, wie Ihre ursprüngliche Tabelle aussieht. Wenn es eher so ist:

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

Dann können Sie die Abfrage wie folgt ändern:

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

Bearbeiten :TO fügte den JSON-Wert zur Produktspalte hinzu:

demo:db<>fiddle

Variante 1:Sie könnten einfach den Typ json umwandeln Geben Sie text ein :

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

Variante 2:Sie lesen den Wert aus dem "name" Attribut:

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