如何在不创建视图的前提下对SQL多子查询结果按部门分组求和?
解决部门分组求和的SQL方案
核心思路
先消除benefitdistribution表中多PLU记录带来的重复数据,再进行关联和最终分组,避免因PLU重复导致部门数据被多次统计。
具体实现代码
假设你的原查询涉及benefitdistribution表与其他业务表关联,调整后的SQL如下:
SELECT dept.deptno, -- TargetGP为部门唯一值,用MAX/MIN提取即可 MAX(agg_plu.TargetGP) AS TargetGP, -- 基于汇总后的销售、成本数据计算部门GP SUM(agg_plu.sales_total) - SUM(agg_plu.cost_total) AS GP FROM ( -- 第一步:对benefitdistribution按部门聚合,消除PLU重复 SELECT deptno, TargetGP, SUM(plu_sales_amount) AS sales_total, SUM(plu_cost_amount) AS cost_total FROM benefitdistribution GROUP BY deptno, TargetGP ) agg_plu -- 关联其他需要的业务表(如果有) JOIN department_info dept ON agg_plu.deptno = dept.deptno GROUP BY dept.deptno;
关键说明
- 预聚合消除重复:通过子查询先对
benefitdistribution按deptno和TargetGP分组,将PLU级的销售、成本数据汇总到部门级,确保每个部门仅返回一条记录 - TargetGP取单值:由于每个部门的TargetGP是唯一值,使用
MAX()或MIN()聚合函数可以安全提取该值,不会改变结果 - GP计算逻辑:基于预聚合后的部门级销售、成本总和计算GP,保证结果是部门维度的准确值
内容的提问来源于stack exchange,提问作者Dave Hamilton
相关产品推荐
相关产品推荐

