Oracle按两列分组并展示另一表所有第二列值的查询问题
调整查询以获取所有COLUMN1与Table1数据的组合结果
你的原查询只返回了Table1和Table2有匹配的组合,而且没有覆盖每个COLUMN1(1、2)和Table1所有数据的全量组合。要得到预期结果,我们需要先构建所有COLUMN1取值与Table1数据的笛卡尔积,再左连接Table2进行聚合。
调整后的SQL语句
-- 先提取Table2中所有唯一的COLUMN1值,再和Table1生成全量组合 WITH DistinctColumn1 AS ( SELECT DISTINCT COLUMN1 FROM Table2 ) SELECT dc1.COLUMN1, t1.column1 AS COLUMN2, COALESCE(SUM(t2.COLUMN3), 0) AS COLUMN3 FROM DistinctColumn1 dc1 CROSS JOIN Table1 t1 LEFT JOIN Table2 t2 ON dc1.COLUMN1 = t2.COLUMN1 AND t1.column1 = t2.column2 GROUP BY dc1.COLUMN1, t1.column1 ORDER BY dc1.COLUMN1, t1.column1;
关键逻辑说明
DistinctColumn1CTE:提取Table2中所有不重复的COLUMN1值(这里是1和2),确保我们覆盖所有需要的分组维度。CROSS JOIN Table1:把每个COLUMN1值和Table1的每一行数据做笛卡尔积,直接生成预期结果的完整行框架(比如1对应data1-data5,2对应data1-data5)。LEFT JOIN Table2:关联到Table2时,同时匹配COLUMN1和data值,没有匹配的记录会返回NULL。COALESCE(SUM(t2.COLUMN3), 0):将SUM结果为NULL的情况替换为0,完全符合你预期里的空值显示需求。- 最后按COLUMN1和Table1的column1排序,和你给出的预期结果顺序完全一致。
执行这个查询后,就能得到你想要的10行全量组合结果,所有无匹配的COLUMN3都会显示为0。
内容的提问来源于stack exchange,提问作者Sudarsan Khan
相关产品推荐
相关产品推荐

