[英]How sum query json array object base on other column on postgresql
I using postgres 14.2 and have 3 column example name , name_adds , aditional我使用 postgres 14.2 并有 3 列示例name , name_adds , aditional
and have rules:并有规则:
{"default":[{"value_1": 100, "value_2": 0.1},{"value_1": 200, "value_2": 0.2}],
"non_default":[{"value_1": 200, "value_2": 0.1}, {"value_1": 400, "value_2": 0.1}]}
[
{
"value_1": 10,
"value_2": 11
},
{
"value_1": 1,
"value_2": 19
}
]
How I can sum format 1 or 2 on point 2 base on rule point 3 and 4. For logic like below如何根据规则点 3 和 4 在点 2 上对格式 1 或 2 求和。对于如下逻辑
if (name == name_adds) {
if (additional contain default) {
sum (default->value_1)
} else {
// format 2.2
sum (value_1)
}
} else {
if (additional contain non_default) {
sum (default->value_1)
} else {
// format 2.2
sum (value_1)
}
}
Expected result:预期结果:
example on table, lets say I have table like below桌子上的例子,假设我有如下表
name name_adds additional
---------------------------------------------------------------
john john {"default":[{"value_1": 100, "value_2": 0.1},
{"value_1": 200, "value_2": 0.2}],"non_default":
[{"value_1": 200, "value_2": 0.1}, {"value_1": 400,
"value_2": 0.1}]}
john doe {"default":[{"value_1": 100, "value_2": 0.1},
{"value_1": 200, "value_2": 0.2}],"non_default":
[{"value_1": 200, "value_2": 0.1}, {"value_1": 400,
"value_2": 0.1}]}
downy downy [{"value_1": 10, "value_2": 11},{"value_1": 1,"value_2": 19}]
downy dan [{"value_1": 10, "value_2": 11},{"value_1": 1,"value_2": 19}]
and expected table as和预期的表为
name name_adds sum_result
---------------------------------------------------------------
john john 300
john doe 600
downy downy 11
downy dan 11
I have doing like demo link below, but still not as expected demo我做了下面的演示链接,但仍然没有达到预期的演示
with cte as (
select
name,
name_adds,
(name = name_adds) name_as_adds,
jsonb_path_query(additional,'$.default[*].value_1') ::numeric with_default
,jsonb_path_query(additional,'$.non_default[*].value_1')::numeric with_no_default
,jsonb_path_query(additional,'$[*].value_1')::numeric as ignore_defaults
from test_json),
cte2 as (
select
name, name_adds,
case when ignore_defaults is null and name_as_adds then with_default
when ignore_defaults is null and name_as_adds is false then with_no_default
when ignore_defaults is not null then ignore_defaults
end as cases
from cte)
select name, name_adds, sum(cases) as sum_result from cte2 group by 1, 2 order by 1 desc;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.