You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB聚合查询中如何计算各分类年成本占总年成本的百分比

实现方案

核心逻辑

你需要在现有聚合管道的基础上,新增两步计算:先统计所有分类的总年度成本,再用单分类年成本除以总年度成本得到价值占比。
推荐使用MongoDB 5.0及以上版本支持的$setWindowFields算子实现,无需拆分管道即可快速得到全局总和。

完整修改后的聚合语句

db.collection.aggregate([
    // 原有门店过滤逻辑不变
    {
        $match: {
            store_name: "jasperstore"
        }
    },
    // 原有分组逻辑不变,删除重复定义的冗余count字段
    {
        $group: {
            _id: {
                category: "$category",
            },
            "total_sku": {
                "$addToSet": "$sku"
            },
            "annual_cost": {
                $sum: "$rate_gst"
            },
            "total_mrp": {
                $sum: "$mrp"
            },
            total_margin_half: {
                $sum: { 
                    $subtract: [
                        { $sum: "$mrp" },
                        { $sum: "$rate_gst" }
                    ]
                }
            }
        }
    },
    // 原有字段映射逻辑不变
    {
        $project: {
            "sku count": {
                "$size": "$total_sku"
            },
            "annual cost": "$annual_cost",
            "annual mrp": "$total_mrp",
            "margin %": {
                $divide: [ "$total_margin_half", "$total_mrp" ]
            }
        }
    },
    // 新增:计算全部分类的总年度成本,写入每个文档的临时字段
    {
        $setWindowFields: {
            sortBy: {},
            output: {
                total_all_cost: {
                    $sum: "$annual cost",
                    window: { documents: ["unbounded", "unbounded"] }
                }
            }
        }
    },
    // 新增:计算价值占比,乘以100直接返回百分比格式,不需要可删除$multiply逻辑
    {
        $addFields: {
            "value share %": {
                $multiply: [
                    { $divide: ["$annual cost", "$total_all_cost"] },
                    100
                ]
            }
        }
    },
    // 可选:如果不需要展示总年度成本字段,可以追加该阶段删除临时字段
    {
        $project: {
            total_all_cost: 0
        }
    }
])

低版本MongoDB兼容方案(<5.0版本)

如果你的MongoDB版本不支持$setWindowFields,可以用$facet算子替代实现:

// 原有match、group、project阶段保持不变,在原有project阶段后替换为以下逻辑
{
  $facet: {
    category_detail: [], // 存放原有各分类的明细数据
    total_cost: [
      {
        $group: {
          _id: null,
          total_all_cost: { $sum: "$annual cost" }
        }
      }
    ]
  }
},
{
  $unwind: "$category_detail"
},
{
  $unwind: "$total_cost"
},
{
  $project: {
    _id: "$category_detail._id",
    "sku count": "$category_detail.sku count",
    "annual cost": "$category_detail.annual cost",
    "annual mrp": "$category_detail.annual mrp",
    "margin %": "$category_detail.margin %",
    "value share %": {
      $multiply: [
        { $divide: ["$category_detail.annual cost", "$total_cost.total_all_cost"] },
        100
      ]
    }
  }
}

内容的提问来源于stack exchange,提问作者CK5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 01:15:07