查询和连接多个表。只选择可能存在的许多记录

时间:2017-08-28 18:08:22

标签: sql sql-server-2012 inner-join

我对此查询有些困难,我基本上不确定这样的事情是否可能一次性完成。

TBL1

 RefNum         ClientID       SWID
 1              17             79
 3              17             90
 18             23             88
 34             18             88
 56             34             90

TBL2

 SWID            SCity
 79              Syracuse
 90              Elmond
 88              Albureque

在tbl1中,我可以拥有多个具有独特RefNum的ClientID记录 - 因为这是主键;自动递增。

我只希望能够为每个clientID选择TOP 1(每个客户端只有一条记录)。此外,我希望使用SWID加入tbl2以获取 SCity

我希望它最终看起来像这样(一厢情愿)我甚至不知道这是否可以通过一个查询

Count      City
1          Syracuse
2          Elmond
1          Albureque

我只有Albureque的Count = 1的原因是,对于Albureque(SWID = 88),同一客户端出现2(clientID = 17)。在这种情况下,我只计算一次。

我有大约480000条记录,我基本上需要一个摘要报告,它将显示SCity的未重复的ClientID的计数。任何帮助将不胜感激。

编辑:

 RefNum         ClientID       SWID
 1              17             79
 2              17             79
 18             23             79
 3              17             90
 87             17             88

期望的最终结果

 Count              City
 2                  Syracuse (79)
 1                  Elmond  (90)
 1                  Albureque (88)

所以基本上Client 17有两个相同SWID(79)的实例,所以我们只把它算作一个。但客户17还有另一个SWID 90和88的记录,在这种情况下,我们仍然希望将记录计为90和88的1。

Syracuse有2,因为客户17有Syracuse(79),而Client 23也有Syracuse - 因为客户17有2条记录,我们把它们卷成1 + 1(客户23)= 2。

偶数转折部分是SWID有时可能不同,但实际城市是相同的。因此,例如ClientID = 9可以具有SWID = 109和SWID = 198,但是在tbl2中 - SCITY在两种情况下都是旧金山。原因是tbl2实际上不是参考表,SWID实际上与社区人员相关联,社区人员可能位于同一个城市但只是位于不同的办公室。所以SWID = 109是旧金山的John Doe,SWID = 198也是旧金山的Jane Smith。

1 个答案:

答案 0 :(得分:2)

我认为您需要joincount(distinct)

select t2.scity, count(distinct t1.clientId)
from tbl1 t1 join
     tbl2 t2
     on t1.swid = t2.swid
group by t2.scity;