sql >> Databasteknik >  >> RDS >> PostgreSQL

Slå samman flera rader till en med mer än ett radvärde i en kolumn

Från ditt nuvarande tillstånd kan du helt enkelt göra pivoten med FILTER klausul:

demo:db<>fiol

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

Jag är inte helt säker på hur ditt ursprungliga bord ser ut. Om det är mer så här:

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

Sedan kan du ändra frågan så här:

demo:db<>fiol

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

Redigera :FÖR ATT lägga till JSON-värdet i produktkolumnen:

demo:db<>fiol

Variant 1:Du kan helt enkelt casta typen json i skriv text :

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

Variant 2:Du läser värdet från "name" attribut:

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



  1. Använder Template::Toolkit med arraydata från databasen

  2. Blob och lagringskrav

  3. Tabelltyp i Oracle Stored Procedure Exempel

  4. PacketTooBigException när du kör en ekolodsanalys