SQL多次左连交易表统计同事营收时SUM结果过大原因排查
问题诊断与解决方案
结果偏大的核心原因
多次左连接同一张交易表产生了笛卡尔积,导致单条交易记录被重复累加:
- 当某同事ID同时匹配多条交易的code1、code2、code3字段时,三次左连接会将所有符合关联条件的交易做笛卡尔乘积拼接。例如某同事有2条code1匹配的交易、2条code2匹配的交易、2条code3匹配的交易,三次连接后会生成222=8条中间记录,每条原始交易的营收会在求和时被重复计数多次,最终结果远大于实际值。
单查询实现的正确写法
不需要多次关联交易表,将匹配逻辑放到聚合判断层即可,参考代码如下:
SELECT c.Name, SUM(CASE WHEN t.code1 = c.ID AND t.RevMth <= 3 THEN t.Rev ELSE 0 END) AS Sum1, SUM(CASE WHEN t.code2 = c.ID AND t.RevMth <= 3 THEN t.Rev ELSE 0 END) AS Sum2, SUM(CASE WHEN t.code3 = c.ID AND t.RevMth <= 3 THEN t.Rev ELSE 0 END) AS Sum3 FROM Colleagues c LEFT JOIN Trans t ON c.ID = t.code1 OR c.ID = t.code2 OR c.ID = t.code3 GROUP BY c.Name
该写法会先拉取所有和当前同事任意code字段匹配的交易(每条交易仅出现一次),再按不同code的匹配规则分别求和,完全匹配你的业务逻辑,和Excel SUMIFS的计算结果一致。
内容的提问来源于stack exchange,提问作者user525966
相关产品推荐
相关产品推荐

