简体   繁体   English

如何基于postgresql上的其他列求和查询json数组对象

[英]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 列示例namename_addsaditional

and have rules:并有规则:

  1. name and name_adds can be fill with same value or not. namename_adds可以填充相同的值,也可以不填充。 Example -> name (john) and name_adds (doe) or both value is (john)示例 -> name (john)name_adds (doe)或两者的值都是(john)
  2. additional column can be 2 format value on the below附加列可以是下面的 2 格式值
  • first value can be第一个值可以是
{"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}]}
  • second value can be第二个值可以是
[
{
    "value_1": 10,
    "value_2": 11
},
{
    "value_1": 1,
    "value_2": 19
}
]
  1. to sum default -> value_1 ( name == name_adds )总结默认值 -> value_1 ( name == name_adds )
  2. to sum non_default -> value_1 ( name != name_adds )总结 non_default -> value_1 ( name != name_adds )

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM