嵌套SQL聚合语句精简列数:按SKU及集群ID聚合数据需求
解决SKU+集群ID聚合结果行数过多的问题
首先,你的核心问题很明确:你想按SKU和集群ID分组聚合,但当前查询因为保留了门店级别的维度(比如STORE_NUMBER),导致结果被拆分成了每个门店的行,最终输出4万行(5个SKU×8000家门店),而不是你期望的35行(SKU×集群ID的唯一组合)。
为什么原来的查询失效?
你用了DISTINCT试图去重,但DISTINCT会保留所有SELECT子句中字段的唯一组合——因为你的查询里嵌套了门店表和映射表,把STORE_NUMBER这类门店级字段带了进来,所以每一行都是不同的「SKU+集群+门店」组合,自然会有4万行。另外,你虽然用了SUM(ALLOCATED_QTY),但没有明确按SKU和ALLOC_CLUSTER_ID做GROUP BY,数据库会默认按所有非聚合字段分组(包括门店),这也会导致结果拆分到门店级别。
修正后的查询思路
我们需要先明确聚合维度(SKU + 集群ID),然后移除不必要的门店字段,用GROUP BY代替DISTINCT来做维度级别的聚合。以下是简化后的示例SQL:
-- 按SKU和集群ID聚合总分配数量,得到你期望的35行结果 SELECT -- 替换成你实际的SKU字段名(比如ALC_ITEM_LOC里的SKU) L.SKU, -- 集群ID来自映射表 M.ALLOC_CLUSTER_ID, -- 聚合每个SKU+集群的总分配数量 SUM(L.ALLOCATED_QTY) AS TOTAL_ALLOCATED FROM ALC_ITEM_LOC L -- 关联门店-集群映射表,把门店号映射到对应的集群ID JOIN FDT_MAP_CLUSTER_LOCATION M ON L.LOCATION = M.LOCATION -- 假设LOCATION是门店号的关联字段 -- 如果需要过滤有效门店,可以在这里加WHERE条件 -- WHERE S.STORE_STATUS = 'ACTIVE' -- 必须按聚合维度分组 GROUP BY L.SKU, M.ALLOC_CLUSTER_ID -- 可选:过滤掉没有分配数量的组合 HAVING SUM(L.ALLOCATED_QTY) > 0;
额外调试建议
- 先确认维度组合数量:单独运行
SELECT DISTINCT SKU, ALLOC_CLUSTER_ID FROM ALC_ITEM_LOC L JOIN FDT_MAP_CLUSTER_LOCATION M ON L.LOCATION = M.LOCATION,看看结果是不是正好35行,这样能确认你的SKU和集群ID的唯一组合数是否符合预期。 - 检查关联字段正确性:确保
LOCATION确实是门店号的映射字段,避免因为关联错误导致维度混乱。 - 减少不必要的嵌套:原来的查询嵌套了多层
RIGHT JOIN,如果不需要保留无匹配的行,用INNER JOIN会更清晰,也能避免引入多余的空值行。
内容的提问来源于stack exchange,提问作者alex_fields1
相关产品推荐
相关产品推荐

