【问题标题】:querying and joining multiple tables. Only selecting a single records out of many that may exist查询和连接多个表。仅从可能存在的许多记录中选择单个记录
【发布时间】:2017-08-28 18:08:21
【问题描述】:

我在查询这个问题时遇到了一些困难,我基本上不确定这样的事情是否可以一次性完成。

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)

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

锡拉丘兹有 2 条,因为客户 17 有锡拉丘兹 (79),客户 23 也有锡拉丘兹 - 由于客户 17 有 2 条记录,我们将它们汇总为 1 + 1(客户 23)= 2。

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

【问题讨论】:

  • TOP 1 是否表示每个 clientID 的 RefNum 最小值的行?或者是否可以返回任何带有 clientID 的行,只要每个客户 ID 只有一行?
  • @Yunnosch 我们希望确保为每个城市单独展示客户。因此,如果它有 1 个城市 = 88 的记录,则显示为 1。然后,如果它有 2 个城市 = 90 的记录,则仍将其显示为 1。基本上,如果客户有 5 个不同城市的 1 条记录,我们希望将客户显示为五个城市各 1 个
  • ClientID 17 在 Syracuse (79) 和 Elmond (90) 中,而不是在 Albureque (88) 中,根据您上面的示例数据。
  • @FerdinandGaspar - 请参阅编辑!

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


【解决方案1】:

我想你想要joincount(distinct)

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

【讨论】:

  • 我不确定这个查询是如何工作的。如果一个 ClientID 有同一个办公室的 2 条记录,我想把它计为 1。但是,如果同一个 ClientID 有一个城市 A 的记录,一个城市 B 的记录,那么我想把它计为 1城市 A 和城市 B 的 1 - 这会这样吗?
  • 使用这个查询。
  • 是的。 count(distinct t1.clientId),表示每个城市只统计一个clientid。
  • @FerdinandGaspar - 即使 SWID 不同但 tbl2 中的 SCITY 相同?
  • 您的意思是您的 SWID 79 可能是 Syracuse,SWID 80 也可能是 Syracuse?
猜你喜欢
  • 1970-01-01
  • 2018-01-14
  • 2016-02-03
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多