【问题标题】:Postgresql group by query to convert json formatPostgresql group by query 转换 json 格式
【发布时间】:2021-03-30 23:05:28
【问题描述】:

我的tabla数据如下;

_id product_id product_name sell_price purchase_price country
1 prd_1 product one 15 12 usa
2 prd_1 product one 16 13 canada
3 prd_2 product two 7 5 china
4 prd_2 product two 12 10 japan

我想根据产品对其进行分组并将其转换为 json 格式。我想要的最终版本如下;

{ 
    "_id" : "prd_1", 
    "details" : [
        {
            "_id" : 1, 
            "product_id" : "prd_1", 
            "product_name" : "product one", 
            "sell_price" : 15, 
            "purchase_price" : 12, 
            "country" : "usa"
        }, 
         {
            "_id" : 2, 
            "product_id" : "prd_1", 
            "product_name" : "product one", 
            "sell_price" : 16, 
            "purchase_price" : 13, 
            "country" : "canada"
        },   
    ]
}
{ 
    "_id" : "prd_2", 
    "details" : [
        {
            "_id" : 3, 
            "product_id" : "prd_2", 
            "product_name" : "product two", 
            "sell_price" : 7, 
            "purchase_price" : 5, 
            "country" : "china"
        }, 
         {
            "_id" : 4, 
            "product_id" : "prd_2", 
            "product_name" : "product two", 
            "sell_price" : 10, 
            "purchase_price" : 12, 
            "country" : "japan"
        },   
    ]
}

我创建了以下查询,但它没有给出我想要的结果。因为我只想一列所有 json 对象。我们如何创建我想要的查询?有可能吗?

select product_id,
       json_agg(obj) as details
  from (
    select product_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 product_id;

【问题讨论】:

    标签: json postgresql group-by aggregate-functions postgresql-13


    【解决方案1】:

    你已经接近了。只需要将整个内容包裹在另一个 json_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)
    

    【讨论】:

      猜你喜欢
      • 2014-02-20
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多