1

비즈니스 규칙에 따라 중복 계정 목록을 표시하는 보고서가 있습니다. 이것은 하나의 새 계정이 다른 기존 계정과 일치 할 때 작동합니다. 문제가있는 부분은 여러 개의 새 계정이 동일한 기존 복제본과 일치하는 경우입니다.두 개의 열을 기반으로 한 SSRS 그룹

NewID MatchedID FirstName LastName AddDate  Address  PhoneNumber 
10  10   Holly  Johnson  4/18/2013 123 1St Rd. 123 456 7890 
10  2   Hollie  Johnson  1/1/1990  123 1St Rd. 123 456 7890 

11  11   Holley  Johnson  4/17/2013 123 1St Rd. 123-456-7890 
11  2   Hollie  Johnson  1/1/1990  123 First Rd. 123 456 7890 

50  50   William  Johnson  4/17/2013 999 2nd St. 222 222 2222 
50  3   Bill  Jonson  1/2/1990  999 Second St. 222-222-2222 

경기가 계정 자체가 비교를 위해 포함되어 있습니다 여기가 NEWID별로 그룹화, 지금 보이는 방법의 예입니다.

그래서 유사한 계정을 중복없이 그룹화 할 수있는 방법이 있습니까? 다음과 같이 표시되어야합니다 :

GroupID AcctID FirstName LastName AddDate  Address  PhoneNumber 
1  2  Hollie  Johnson  1/1/1990  123 First Rd. 123 456 7890 
1  10  Holly  Johnson  4/18/2013 123 1St Rd. 123 456 7890 
1  11  Holley  Johnson  4/17/2013 123 1St Rd. 123-456-7890 
2  50  William  Johnson  4/17/2013 999 2nd St. 222 222 2222 
2  3  Bill  Jonson  1/2/1990  999 Second St. 222-222-2222 

그룹화가 SQL 또는 SSRS로 수행되는지는 상관 없습니다. 이름, 주소 및 전화 번호가 다를 수 있으므로 두 ID 열을 참조해야합니다. 보고서에 그룹화 할 수 있도록 할당 된 새 GroupID가 필요합니다.

+0

나는 당신이 여기서 무엇을 묻고 있는지 정말로 모르겠습니다. 다음을 제공 할 수 있습니까? 기본 데이터의 샘플, 해당 샘플로 현재 가져온 결과 및 해당 샘플로 얻으려는 결과. –

+0

제안 된대로 예제를 확장했습니다. – StevenWhite

+0

위의 "New -> 10 Matched -> 2"와 "New -> 11 Matched -> 2"중에서 어떻게 선택합니까? 가장 낮은'NewID'를 가진 것을 선택하고 있습니까? 또한 중복 된'MatchedId' 값을 없애기를 원하십니까? 아니면 모든 추가 주소 필드도 고려해야합니다> –

답변

1

당신은 행을 제거하는 순위 기능을 사용할 수 있습니다 :

with NoDuplicates as 
(
    select * 
    , rownum = row_number() over (partition by MatchedID order by NewID) 
    from Accounts 
) 
select NewID 
    , MatchedID 
    , Name 
    , AddDate 
    , Address 
    , phoneNumber 
from NoDuplicates where rownum = 1 

SQL Fiddle with demo합니다.

그냥 주소 정보가 항상 너무 중복 가정 GROUP BY을 사용할 수없는 이유가 없다하더라도 :

select NewID = min(NewID) 
    , MatchedID 
    , Name 
    , AddDate 
    , Address 
    , phoneNumber 
from Accounts 
group by MatchedID 
    , Name 
    , AddDate 
    , Address 
    , phoneNumber 

SQL Fiddle with demo가.

두 가지 모두 예상 한 결과를 반환합니다. 코멘트 후

편집 :

할 수 있습니다이 같은 문 그룹 관련 행 :

with NoDuplicates as 
(
    select * 
    , rownum = row_number() over (partition by MatchedID order by NewID) 
    from Accounts 
    where NewID <> MatchedID 
) 
select groupID = MatchedID 
    , Acct = MatchedID 
    , FirstName 
    , AddDate 
    , Address 
    , phoneNumber 
from NoDuplicates where rownum = 1 
union all 
select groupID = coalesce(am.MatchedID, a.NewID) 
    , Acct = a.MatchedID 
    , a.FirstName 
    , a.AddDate 
    , a.Address 
    , a.phoneNumber 
from Accounts a 
    -- join to the corresponding matched account 
    left join Accounts am on a.MatchedID = am.NewID and am.NewID <> am.MatchedID 
where a.NewID = a.MatchedID 
order by groupID, Acct 

SQL Fiddle with demo.

그러나 이것은 본질적으로 단지 MatchedID에 의한 것입니다. 당신이 1부터 번호가 그룹을 원하는 경우에, 당신은 문에 DENSE_RANK 절을 추가 할 수 있습니다

with NoDuplicates as 
(
    select * 
    , rownum = row_number() over (partition by MatchedID order by NewID) 
    from Accounts 
    where NewID <> MatchedID 
) 
, GroupedAcct as 
(
    select GroupID = MatchedID 
    , Acct = MatchedID 
    , FirstName 
    , AddDate 
    , Address 
    , phoneNumber 
    from NoDuplicates where rownum = 1 
    union all 
    select GroupID = coalesce(am.MatchedID, a.NewID) 
    , Acct = a.MatchedID 
    , a.FirstName 
    , a.AddDate 
    , a.Address 
    , a.phoneNumber 
    from Accounts a 
    -- join to the corresponding matched account 
    left join Accounts am on a.MatchedID = am.NewID and am.NewID <> am.MatchedID 
    where a.NewID = a.MatchedID 
) 
select GroupID = Dense_Rank() over (order by GroupID) 
    , Acct 
    , FirstName 
    , AddDate 
    , Address 
    , phoneNumber 
from GroupedAcct 
order by groupID, Acct 

SQL Fiddle with demo합니다.

+0

첫 번째 예제는 완벽하게 작동하는 것 같습니다. 바이올린 예제도 좋았습니다. 감사! – StevenWhite

+0

주소, 전화 번호 등이 다양하므로 그걸 그룹으로 묶을 수는 없습니다. – StevenWhite

+0

그러면 의미가 있습니다. 좋았어, 다행스럽게 도왔다. –

관련 문제