Snowflake SQL:左连接前汇总支付金额且保留表A明细
解决方案
要解决表A行重复的问题,核心是先对表B按ID汇总支付总额,再与表A左连接,这样既保留表A的所有明细,又不会因为表B的重复ID导致行重复。
方法1:子查询写法
直接在JOIN语句中嵌套子查询完成表B的汇总:
SELECT A.ID, A.Part_Description, A.Part_Cost, B_SUMMARY.Total_Payment FROM TableA AS A LEFT JOIN ( -- 按ID汇总表B的支付总额 SELECT ID, SUM(Total_Payment) AS Total_Payment -- 注意:如果表B的支付字段不是Total_Payment,请替换为实际字段名 FROM TableB GROUP BY ID ) AS B_SUMMARY ON A.ID = B_SUMMARY.ID;
方法2:CTE写法(更易读)
用公共表表达式(CTE)拆分逻辑,新手更容易理解:
WITH B_SUMMARY AS ( SELECT ID, SUM(Total_Payment) AS Total_Payment FROM TableB GROUP BY ID ) SELECT A.ID, A.Part_Description, A.Part_Cost, B_SUMMARY.Total_Payment FROM TableA AS A LEFT JOIN B_SUMMARY ON A.ID = B_SUMMARY.ID;
关键逻辑说明
- 表B的预处理:通过
GROUP BY ID将同一ID的多条支付记录合并,用SUM()计算该ID的总支付金额,确保每个ID仅返回一行汇总数据。 - 左连接表A:汇总后的表B每个ID对应一行,与表A连接时,表A的每一行只会匹配一次,彻底避免了原写法中表A行重复的问题。
- 空值处理:如果表B中没有某ID的记录,左连接后
Total_Payment会显示为NULL,符合左连接保留表A所有行的要求。
内容的提问来源于stack exchange,提问作者Scotchy
相关产品推荐
相关产品推荐

