按销售部门聚合销售数据的SQL嵌套查询实现方法
基于第一层分组结果实现最终聚合的SQL方案
完全可以基于已有的第一层分组SELECT语句,通过嵌套查询(子查询/CTE)实现最终聚合效果,无需额外创建临时表。
核心实现思路
- 第一层逻辑:先完成REGION字段派生,按
SALES_DIVISION、REGION、STATE三个维度分组,生成对应0/1状态的EAST、CENTRAL、PAC列,以及已定义好计算规则的EAST_CENTRAL、CENTRAL_PACIFIC字段 - 第二层聚合:以第一层查询结果为输入,按
SALES_DIVISION维度做聚合:- REGION、STATE字段固定返回NULL实现留空
- EAST、CENTRAL、PAC三列取分组内最大值:同部门下只要对应区域有1条正销售额记录,最大值即为1,不会出现多州累加的情况,完全符合0/1取值要求
- EAST_CENTRAL、CENTRAL_PACIFIC两列直接对分组内的值求和,实现符合条件的州数量累加
完整可运行SQL示例
如果你已经有写好的第一层分组语句,直接替换下方代码中对应注释位置的内容即可:
SELECT SALES_DIVISION, NULL AS REGION, NULL AS STATE, MAX(EAST) AS EAST, MAX(CENTRAL) AS CENTRAL, MAX(PAC) AS PAC, SUM(EAST_CENTRAL) AS EAST_CENTRAL, SUM(CENTRAL_PACIFIC) AS CENTRAL_PACIFIC FROM ( /* 下方是第一层分组的参考实现,可直接替换为你已写好的第一层SELECT语句 */ SELECT SALES_DIVISION, REGION, STATE, CASE WHEN REGION = 'EASTERN' AND SUM(SALES_AMT) > 0 THEN 1 ELSE 0 END AS EAST, CASE WHEN REGION = 'CENTRAL' AND SUM(SALES_AMT) > 0 THEN 1 ELSE 0 END AS CENTRAL, CASE WHEN REGION = 'PACIFIC' AND SUM(SALES_AMT) > 0 THEN 1 ELSE 0 END AS PAC, -- 此处替换为你实际业务中EAST_CENTRAL的计算逻辑 CASE WHEN REGION IN ('EASTERN','CENTRAL') AND SUM(SALES_AMT) > 0 THEN 1 ELSE 0 END AS EAST_CENTRAL, -- 此处替换为你实际业务中CENTRAL_PACIFIC的计算逻辑 CASE WHEN REGION IN ('CENTRAL','PACIFIC') AND SUM(SALES_AMT) > 0 THEN 1 ELSE 0 END AS CENTRAL_PACIFIC FROM ( -- 基础层:派生REGION字段 SELECT SALES_DIVISION, STATE, SALES_AMT, CASE WHEN STATE IN ('NY','MA') THEN 'EASTERN' WHEN STATE IN ('IL','TX') THEN 'CENTRAL' WHEN STATE IN ('CA','OR','WA') THEN 'PACIFIC' ELSE NULL END AS REGION FROM SALES_TABLE ) t_base GROUP BY SALES_DIVISION, REGION, STATE /* 第一层参考实现结束 */ ) t_level1 GROUP BY SALES_DIVISION;
注意事项
- 不要用SUM处理EAST、CENTRAL、PAC三列,否则会出现同区域多州符合条件时数值大于1的问题,
MAX()是最简洁的实现方式 - 如果你的第一层查询已经作为视图存在,只需要把FROM后面子查询的部分替换成视图名即可
- 如果REGION为NULL的无匹配区域记录,不会对三个区域标识列和两个跨区统计字段产生影响,会自动按0处理
内容的提问来源于stack exchange,提问作者punsoca
相关产品推荐
相关产品推荐

