如何避免左 table 中的重复项,其中主键在联接 table 中不是唯一的
How to avoid duplicates in left table where primary key is not unique in joined table
我在加入 2 个 table 时遇到 SUM 问题,主键在左侧 table 是唯一的,但在右侧 table 可以重复。我遇到的情况是,case_id 可能在左侧 table 支付了 100 英镑,然后在较低级别细分为右侧的 2 英镑 50 支付 table。这导致在加入时左侧 table 付款被计算两次,因为 case_id 在右侧 table.
中存在两次
我已经尝试了多种不同的查询变体,但到目前为止都没有成功。我也搜索过这个网站,但一直无法找到适合我的场景。
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,但是我发现 total_redress_value 的 SUM 是 200,因为来自加入。非常感谢任何帮助。
按左边的 PK 把你右边 table 分组。
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];
不幸的是,这种分层计算有点复杂。您可以在 join
ing:
之前预先聚合 t2
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]
请注意 group by
几乎不需要 select distinct
。在这种情况下当然不需要它。
我在加入 2 个 table 时遇到 SUM 问题,主键在左侧 table 是唯一的,但在右侧 table 可以重复。我遇到的情况是,case_id 可能在左侧 table 支付了 100 英镑,然后在较低级别细分为右侧的 2 英镑 50 支付 table。这导致在加入时左侧 table 付款被计算两次,因为 case_id 在右侧 table.
中存在两次我已经尝试了多种不同的查询变体,但到目前为止都没有成功。我也搜索过这个网站,但一直无法找到适合我的场景。
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,但是我发现 total_redress_value 的 SUM 是 200,因为来自加入。非常感谢任何帮助。
按左边的 PK 把你右边 table 分组。
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];
不幸的是,这种分层计算有点复杂。您可以在 join
ing:
t2
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]
请注意 group by
几乎不需要 select distinct
。在这种情况下当然不需要它。