SQL联接表导致重复

SQL联接表导致重复,sql,join,duplicates,Sql,Join,Duplicates,因此,表A是一个包含保单id信息的整体表,而表b是保单id,并附有索赔要求。并非A中的所有id都存在于B中,但我希望将两个表合并并求和(总索赔) 问题是,该总和远远高于表本身中的实际总和 以下是我到目前为止所做的尝试: select a.policy_id, coalesce(sum(b.claim_amt), 0) from database.table1 as a left join database2.table2 as b on a.policy_id = b.policy_id whe

因此,表A是一个包含
保单id
信息的整体表,而表b是
保单id
,并附有索赔要求。并非A中的所有id都存在于B中,但我希望将两个表合并并求和(总索赔)

问题是,该总和远远高于表本身中的实际总和

以下是我到目前为止所做的尝试:

select a.policy_id, coalesce(sum(b.claim_amt), 0)
from database.table1 as a
left join database2.table2 as b on a.policy_id = b.policy_id
where product_code = 'CI'
group by a.policy_id

b中不存在的id显示得很好,旁边有一个0,是确实存在的id,索赔金额似乎在总和中大量重复。

我怀疑您的
保单id
表1
中不是唯一的,这会导致金额翻倍、三倍等 您可以在一个CTE中汇总
表2
中的总和来解决这个问题

WITH CTE AS (
SELECT
  policy_id
  coalesce(sum(claim_amt), 0) as sum_amt
FROM database2.table2 
group by policy_id
)
select a.policy_id, b.sum_amt
from database.table1 as a
left join CTE as b on a.policy_id = b.policy_id
where product_code = 'CI'

policy\u id
是第一个表的主键吗?如果它在该表中不是唯一的,您可以期望数字被重复计算。请在代码问题中给出一个--cut&paste&runnable代码,包括作为代码输入的最小代表性示例;期望和实际输出(包括逐字记录错误消息);标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。(调试基础。)用于包含DBMS和DDL(包括约束和索引)的SQL,并将其作为格式化为表的代码输入。暂停总体目标的工作,将代码切掉到第1个表达式,不要给出您期望的内容,说出您期望的内容和原因。发布时,您被告知使用比“sql”更具体的DBMS标记。给出DBMS名称和版本。这似乎是一个常见错误,人们希望某些子查询的某些联接,每个联接可能涉及不同的键,每个子查询可能涉及联接和/或聚合,但他们错误地尝试进行所有联接,然后再进行所有聚合或在以前的聚合上进行聚合。在适当的行上编写单独的聚合和/或聚合一个case语句;在唯一列集上联接。有时,独立聚合在非键联接之后选择正确的值。(两个输入表中任意一个的非键上的联接可以为每个输入表的每个键提供多个输出行。)