Я работаю с PostgreSQL 9.6.
Если суммировать все атрибуты в 1-ом уровне jsonb, мы можем сделать следующее:
drop table if exists tmp;
create table tmp(id bigserial PRIMARY KEY NOT NULL, data jsonb);
insert into tmp(data) values
('{"a":100,"b":200,"c":300}'),('{"a":10,"b":20,"c":30}'),('{"a":1,"b":2,"c":3}');
select jsonb_object_agg(key, sum)
from
(
select key, sum(value::int)
from tmp
cross join jsonb_each_text(data)
group by key
) tmp_each;
результат:
{"a":111,"b":222,"c":333}
Но если jsonb подал с вложенным jsonb более чем на 1 уровень, как показано ниже:
insert into tmp(data) values
('{
"a": {
"a1": 110,
"a2": 120,
"a3": 130,
"a4": {
"a41": 141,
"a42": 142,
"a43": 143,
"a44": 144,
"a45": 145
}
},
"b": 200,
"c": 300
}'),
('{
"a": {
"a1": 1110,
"a2": 1120,
"a3": 1130,
"a4": {
"a41": 1141,
"a42": 1142,
"a45": 1145
}
},
"b": 1200,
"c": 1300
}'),
('{
"a": {
"a1": 110,
"a2": 120,
"a3": 130,
"a4": {
"a42": 142,
"a43": 143,
"a44": 144
}
},
"b": 200,
"c": 300
}');
Я могу легко использовать расширение jsonb_deep_sum:
https://github.com/furstenheim/jsonb_deep_sum
SELECT jsonb_deep_sum(data) FROM tmp;
результат:
{
"a": {
"a1": 1330,
"a2": 1360,
"a3": 1390,
"a4": {
"a41": 1282,
"a42": 1426,
"a43": 286,
"a44": 288,
"a45": 1290
}
},
"b": 1600,
"c": 1900
}
Но если я хочу использовать SQL без использования расширения jsonb_deep_sum, как завершить sh SQL?
Большое спасибо за просмотр моего вопроса.