Inner Join是否排除重复?

时间:2012-06-18 19:31:09

标签: sql sql-server sql-server-2008 join

我的疑问:

  select 
  SUM(payments.paid_amt) as paid_amt, 
  SUM(payments.copay_amt) as copay_amt,
  SUM(payments.CO_INSURANCE_AMT) as co_ins_amt,
  payor_group.PAYOR_GROUP as payor_group,
  DATEPART(MM,accession.XIFIN_LOAD_DATE) as load_month,
  DATEPART(yyyy,accession.XIFIN_LOAD_DATE) as load_year,
  accession.ACCESSION_ID


  from 
  [F_PAYOR_PAYMENTS_monthly] payments

  join D_PAYOR payor
  on payor.PAYOR_ID=payments.PAYMENT_PAYOR_ID

  join D_PAYOR_GROUP payor_group
  on payor.PAYOR_GROUP_KEY=payor_group.PAYOR_GROUP_KEY

  join F_ACCESSION_daily accession
  on accession.ACCESSION_ID=payments.ACCESSION_ID

  where accession.XIFIN_LOAD_DATE between '20120501' and '20120531'

  group by  payor_group.PAYOR_GROUP, DATEPART(MM,accession.XIFIN_LOAD_DATE),
  DATEPART(yyyy,accession.XIFIN_LOAD_DATE),accession.ACCESSION_ID

出于某种原因,SUMs多次计算accession.ACCESSION_ID次。

当我正在进行所有这些连接时,我担心的是我可能多次SUMming相同的值。

我怎样才能确保我只计算一次accession.ACCESSION_ID

非常感谢你的帮助和指导。

2 个答案:

答案 0 :(得分:4)

您的付款表中可能有多个具有相同ACCESSION_ID的行,且付款人组不同。由于您也是按payor_group进行分组,因此最终会出现多重登录ID。

然而,我们需要确定一些样本数据。

答案 1 :(得分:3)

问题是数据的重复。

要查找导致问题的JOIN,我会依次对每个问题进行评论并检查结果。创建额外数据通常很明显。

如果没有看到数据那就很棘手,但是,例如,如果加入表中有一个GeographyKey,而Payments表没有,如果两个GegraphyKeys之间发生ACCESSION_ID,那么加入时你会得到两行数据这些表一起在ACCESSION_ID上。

一个解决方案可能是在您的OP中点击查询之前对#temp表进行一些初始分组,另一种选择是CTE,如下所示。

;with accession (XIFIN_LOAD_DATE, ACCESSION_ID)
    as 
    (
    select 
        XIFIN_LOAD_DATE
        ,ACCESSION_ID
    from F_ACCESSION_daily
    group by
         XIFIN_LOAD_DATE
         ,ACCESSION_ID
    )
    , payments (PAYMENT_PAYOR_ID, ACCESSION_ID, paid_amt, copay_amt, CO_INSURANCE_AMT)
    as 
    (
    select 
        PAYMENT_PAYOR_ID
         ,ACCESSION_ID
        ,sum(paid_amt) paid_amt
        ,sum(copay_amt) copay_amt
        ,sum(CO_INSURANCE_AMT) CO_INSURANCE_AMT
    from F_PAYOR_PAYMENTS_monthly
    group by
         PAYMENT_PAYOR_ID
         ,ACCESSION_ID
    )
select 
  SUM(payments.paid_amt) as paid_amt, 
  SUM(payments.copay_amt) as copay_amt,
  SUM(payments.CO_INSURANCE_AMT) as co_ins_amt,
  payor_group.PAYOR_GROUP as payor_group,
  DATEPART(MM,accession.XIFIN_LOAD_DATE) as load_month,
  DATEPART(yyyy,accession.XIFIN_LOAD_DATE) as load_year,
  accession.ACCESSION_ID

from 
  payments

  join D_PAYOR payor
  on payor.PAYOR_ID=payments.PAYMENT_PAYOR_ID

  join D_PAYOR_GROUP payor_group
  on payor.PAYOR_GROUP_KEY=payor_group.PAYOR_GROUP_KEY

  join accession
  on accession.ACCESSION_ID=payments.ACCESSION_ID

where accession.XIFIN_LOAD_DATE between '20120501' and '20120531'

group by  
  payor_group.PAYOR_GROUP
  , DATEPART(MM,accession.XIFIN_LOAD_DATE),
  DATEPART(yyyy,accession.XIFIN_LOAD_DATE),accession.ACCESSION_ID