Postgresql按查询分组以转换json格式

Postgresql按查询分组以转换json格式,json,postgresql,group-by,aggregate-functions,postgresql-13,Json,Postgresql,Group By,Aggregate Functions,Postgresql 13,我的表格数据如下 _身份证 产品标识 产品名称 卖出价 购买价格 国家 1. 珠三角1 产品一 15 12 美国 2. 珠三角1 产品一 16 13 加拿大 3. 珠三角2 产品二 7. 5. 中国 4. 珠三角2 产品二 12 10 日本 你很接近。只需将整个内容包装在另一个json\u agg()中,即可将其合并为一行: edb=# select jsonb_pretty(json_agg(tb)::jsonb) from ( select _id, json_agg(obj) as d

我的表格数据如下

_身份证 产品标识 产品名称 卖出价 购买价格 国家 1. 珠三角1 产品一 15 12 美国 2. 珠三角1 产品一 16 13 加拿大 3. 珠三角2 产品二 7. 5. 中国 4. 珠三角2 产品二 12 10 日本
你很接近。只需将整个内容包装在另一个
json\u agg()
中,即可将其合并为一行:

edb=# select jsonb_pretty(json_agg(tb)::jsonb) from (
  select _id, json_agg(obj) as details
  from (
    select product_id as _id, json_build_object(
           '_id', _id,
           'product_id', product_id,
           'product_name', product_name,
           'sell_price', sell_price,
           'purchase_price', purchase_price,
           'country', country
         ) as obj
    from products p) tmp
    group by _id) as tb;
                  jsonb_pretty                  
------------------------------------------------
 [                                             +
     {                                         +
         "_id": "prd_2",                       +
         "details": [                          +
             {                                 +
                 "_id": 3,                     +
                 "country": "china",           +
                 "product_id": "prd_2",        +
                 "sell_price": 7,              +
                 "product_name": "product two",+
                 "purchase_price": 5           +
             },                                +
             {                                 +
                 "_id": 4,                     +
                 "country": "japan",           +
                 "product_id": "prd_2",        +
                 "sell_price": 12,             +
                 "product_name": "product two",+
                 "purchase_price": 10          +
             }                                 +
         ]                                     +
     },                                        +
     {                                         +
         "_id": "prd_1",                       +
         "details": [                          +
             {                                 +
                 "_id": 1,                     +
                 "country": "usa",             +
                 "product_id": "prd_1",        +
                 "sell_price": 15,             +
                 "product_name": "product one",+
                 "purchase_price": 12          +
             },                                +
             {                                 +
                 "_id": 2,                     +
                 "country": "canada",          +
                 "product_id": "prd_1",        +
                 "sell_price": 16,             +
                 "product_name": "product one",+
                 "purchase_price": 13          +
             }                                 +
         ]                                     +
     }                                         +
 ]
(1 row)