jsonmariadbmariadb-10.3

MariaDB: sum values from JSON


I'd like to sum up certain values from a JSON snippet following this example data:

set @json='
{
  "items": [
    {
      "a": {
        "a_amount": "0.0020095"
      },
      "b": {
        "b_amount": "0.0004"
      }
    },
    {
      "a": {
        "a_amount": "0.02763081"
      },
      "b": {
        "b_amount": "0.0055"
      }
    }
  ]
}';

I need to sum all a.a_amount and all b.b_amount independantly, so I'd like to do something like SUM(a.a_amount) and SUM(b.b_amount).

But I haven't gotten any further than extracting the respective values like this:

SELECT JSON_EXTRACT(@json, '$.items[*].a.a_amount') AS sum_a,
       JSON_EXTRACT(@json, '$.items[*].b.b_amount') AS sum_b;
sum_a sum_b
["0.0020095", "0.02763081"] ["0.0004", "0.0055"]

I've fiddled around with JSON_EXTRACT(), JSON_VALUE() and even the ha_connect plugin but still couldn't come up with SQL code that would give me the sums I need.

Who can help me here?


Solution

  • One option is using a DOUBLE conversion along with Recursive CTE through use of JSON_EXTRACT() function such as

    WITH RECURSIVE cte AS
    (
    SELECT 0 i
    UNION ALL
    SELECT i + 1 i
      FROM cte
     WHERE i + 1 <= ( SELECT JSON_LENGTH(json) FROM j )  
    )
    SELECT SUM(CAST(JSON_EXTRACT(json, CONCAT('$.items[',i,'].a.a_amount')) AS DOUBLE)) AS sum_a,
           SUM(CAST(JSON_EXTRACT(json, CONCAT('$.items[',i,'].b.b_amount')) AS DOUBLE)) AS sum_b
      FROM cte,
           j
    
    sum_a sum_b
    0.02964031 0.0059

    Demo