2012-06-18 2 views
-2

내 쿼리 : 어떤 이유로내부 조인은 중복을 제외합니까?

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

샘플 데이터와 원하는 결과를 보여주십시오. 검색어로 데이터를 리버스 엔지니어링 할 수는 없습니다. –

+1

가능한 중복 [내부 조인에서 중복을 제거하는 방법?] (http://stackoverflow.com/questions/11105641/how-to-remove-duplicates-in-an-inner-join) –

답변

4

다른 지급 자 그룹이있는 지급 테이블에 동일한 ACCESSION_ID의 행이 여러 개있을 수 있습니다. payor_group을 사용하여 그룹화 했으므로 멀티 팩 가입 아이디로 끝납니다.

그러나 확실한 몇 가지 샘플 데이터가 필요합니다.

3

문제는 데이터 중복입니다.

어느 JOIN이 문제를 일으키는 지 확인하려면 각각을 차례로 주석 처리하고 결과를 검사하십시오. 여분의 데이터를 만드는 것은 일반적으로 분명합니다.

데이터보기가 까다 롭지 않지만 액세스 테이블에 GeographyKey가 있고 Payments 테이블이 그렇지 않은 경우 ACCESSION_ID가 두 개의 GegraphyKeys에 걸쳐 발생하면 데이터의 두 행을 가져옵니다. 이 테이블을 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 
관련 문제