Tsql 基于两列的SSRS组

Tsql 基于两列的SSRS组,tsql,reporting-services,grouping,duplicate-removal,ssrs-grouping,Tsql,Reporting Services,Grouping,Duplicate Removal,Ssrs Grouping,我有一个报告,根据我们的业务规则显示重复帐户的列表。当一个新帐户与其他现有帐户匹配时,此项功能有效。我遇到的问题是,多个新帐户与相同的现有副本匹配。 下面是一个按NewId分组的示例,展示了它现在的外观: NewID MatchedID FirstName LastName AddDate Address PhoneNumber 10 10 Holly Johnson 4/18/2013 123 1S

我有一个报告,根据我们的业务规则显示重复帐户的列表。当一个新帐户与其他现有帐户匹配时,此项功能有效。我遇到的问题是,多个新帐户与相同的现有副本匹配。 下面是一个按NewId分组的示例,展示了它现在的外观:

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
包含有匹配项的帐户,以供比较

那么,有没有一种方法可以将这些类似的账户分组在一起而不重复?应该是这样的:

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
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还是在SSRS中完成的。它需要引用两个ID列,因为名称、地址和电话号码可能不同。我还需要分配一个新的GroupID,以便在报告中对它们进行分组。

您可以使用排名函数来消除行:

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

尽管没有理由不使用
分组方式
,但前提是地址信息总是重复的:

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

这两个都返回了您的预期结果

评论后编辑:

可以使用如下语句对相关行进行分组:

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
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

.

您可以使用排名函数来消除行:

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

尽管没有理由不使用
分组方式
,但前提是地址信息总是重复的:

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

这两个都返回了您的预期结果

评论后编辑:

可以使用如下语句对相关行进行分组:

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
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

.

我不太清楚你在问什么。您能否提供以下内容:基础数据的样本、您当前使用该样本获得的结果以及您希望使用该样本获得的结果。按照建议展开示例。您如何在上面的
New->10 Matched->2
New->11 Matched->2
之间进行选择?您只是在选择具有最低
NewID
的一个吗?此外,您是否只希望消除重复的
MatchedId
值,或者如果所有额外的地址字段也被考虑在内,那么在这两个字段之间进行选择将是任意的,它们不应被认为是不同的。地址等字段都绑定到MatchedId。换句话说,我想将相关的不同MatchedId进行分组。我不确定你在问什么。您能否提供以下内容:基础数据的样本、您当前使用该样本获得的结果以及您希望使用该样本获得的结果。按照建议展开示例。您如何在上面的
New->10 Matched->2
New->11 Matched->2
之间进行选择?您只是在选择具有最低
NewID
的一个吗?此外,您是否只希望消除重复的
MatchedId
值,或者如果所有额外的地址字段也被考虑在内,那么在这两个字段之间进行选择将是任意的,它们不应被认为是不同的。地址等字段都绑定到MatchedId。换句话说,我想对相关的不同MatchedId进行分组。第一个示例似乎工作得很好。小提琴的例子也不错。谢谢地址、电话号码等确实各不相同,这就是为什么我不能只对这些进行分组。那么,这是有道理的。很酷,很高兴它起到了作用。有没有办法给这些新组分配一个ID?这个方法过滤掉了重复项,但我仍然需要一种方法将它们在报告中相互关联起来,否则就没有什么用处了。@StevenW,MatchedID不满足这个要求吗?如果没有,请您修改问题以显示您的要求结果。很抱歉再次询问更多信息。第一个示例似乎运行良好。小提琴的例子也不错。谢谢地址、电话号码等确实各不相同,这就是为什么我不能只对这些进行分组。那么,这是有道理的。很酷,很高兴它起到了作用。有没有办法给这些新组分配一个ID?这个方法过滤掉了重复项,但我仍然需要一种方法将它们在报告中相互关联起来,否则就没有什么用处了。@StevenW,MatchedID不满足这个要求吗?如果没有,请您修改问题以显示您的要求结果。很抱歉再次询问更多信息。