Search code examples
jsonpostgresqlnosql

Get aggregate sum of json array in Postgres NOSQL json data


How to get aggregate SUM(amount) from "refunds" array in postgres json select Following is my data schema and structure:

Table Name: transactions

Column name: data

{
  "id": "tran_6ac25129951962e99f28fa488993",
  "amount": 1200,
  "origin_amount": 3900,
  "status": "partial_refunded",
  "description": "Subscription#sub_a67d59efb2bcbf73485a ",
  "livemode": false,
  "refunds": [
    {
      "id": "refund_ee4192ffb6d2caa490a1",
      "amount": 1200,
      "status": "refunded",
      "created_at": 1426412340,
      "updated_at": 1426412340,
    },
    {
      "id": "refund_0e4a34e4ee7281d369df",
      "amount": 1500,
      "status": "refunded",
      "created_at": 1426412353,
      "updated_at": 1426412353,
    }
  ]
}

Out put should be: 1200+1500 = 2700

Output
|---------
|total
|---------
|2700

Please provide global solution and not with static data


Solution

  • This should work on 9.3+

    WITH x AS( SELECT
    '{
      "id": "tran_6ac25129951962e99f28fa488993",
      "amount": 1200,
      "origin_amount": 3900,
      "status": "partial_refunded",
      "description": "Subscription#sub_a67d59efb2bcbf73485a ",
      "livemode": false,
      "refunds": [
        {
          "id": "refund_ee4192ffb6d2caa490a1",
          "amount": 1200,
          "status": "refunded",
          "created_at": 1426412340,
          "updated_at": 1426412340
        },
        {
          "id": "refund_0e4a34e4ee7281d369df",
          "amount": 1500,
          "status": "refunded",
          "created_at": 1426412353,
          "updated_at": 1426412353
        }
      ]
    }'::json as y),
    refunds AS(
    SELECT json_array_elements(y->'refunds') as j FROM x)
    SELECT sum((j->>'amount')::int) FROM refunds;