如何避免左表中的重复项,其中主键在连接表中不唯一

问题描述 投票:1回答:2

我在连接2个表时遇到SUM问题,其中主键在左表中是唯一的,但可以在右表中复制。我的情况是,case_id可能在左表中支付了100英镑,然后在较低级别将其分解为右表中的2£50付款。这导致左表付款在加入时被计数两次,因为case_id在右表中存在两次。

我已经尝试了许多不同的查询变体,但到目前为止还没有成功。我也搜索了这个网站,但一直无法找到适合我的场景。

select distinct
    t1.[r_code],
    t1.[parent_case_id],
    sum(t1.[total_redress_value]),
    sum(t2.[payment_amount])
from
    [SomeTable1] t1
left join
    [SomeTable2] t2 on t1.[case_id] = t2.[case_id]
group by 
    t1.[r_code], t1.[parent_case_id]

期望total_redress_value和payment_amount的SUM各为100,但是由于来自连接的重复的case_id行,我发现total_redress_value的SUM是200。任何帮助非常感谢。

sql ms-access ms-access-2010
2个回答
0
投票

不幸的是,这种分层计算有点复杂。您可以在t2ing之前预先汇总join

select t1.[r_code], t1.[parent_case_id],
       sum(t1.[total_redress_value]),
       sum(t2.[payment_amount])
from [SomeTable1] as t1 left join
     (select t2.case_id, sum(t2.payment_amount) as payment_amount
      from [SomeTable2] as t2
      group by t2.case_id
     ) as t2
     on t1.[case_id] = t2.[case_id]
group by t1.[r_code], t1.[parent_case_id]

请注意select distinct几乎不需要group by。在这种情况下肯定不需要它。


1
投票

通过左边的PK将你的桌子分组。

SELECT DISTINCT
       t1.[r_code],
       t1.[parent_case_id],
       SUM(t1.[total_redress_value]),
       SUM(t2.[payment_amount])
FROM [SomeTable1] t1
    LEFT JOIN
    (
        SELECT case_id,
               MIN(payment_amount) AS payment_amount --or sum etc - whatever fits your logic
        FROM [SomeTable2]
        GROUP BY case_id
    ) AS t2
        ON t1.[case_id] = t2.[case_id]
GROUP BY t1.[r_code],
         t1.[parent_case_id];
© www.soinside.com 2019 - 2024. All rights reserved.