SQL Server连接两个表计数

时间:2014-01-30 19:38:43

标签: sql sql-server join count

我想通过计算表2中访问表1中组合的人来加入表1和表2,结果看起来像

表1

City1  City2

Rome   Berlin 
Moscow Berlin

....更多行(要清楚 - 这只是一个摘录) 表2

Person City

Peter Rome
Peter Paris
Peter Berlin
Peter Moscow
Paul  Rome
Paul  Moscow
Mary  London
Mary  Moscow
Mary  Berlin

......更多行

我希望它看起来像是什么:

Rome   Berlin 0
Moscow Berlin 3
London Berlin 1

任何帮助表示感谢。

这是我到目前为止所做的:

select a.city1
     , a.city2
     , count(case when city=a.city1 and city=a.city2 THEN city ELSE NULL END) 
from table1 a join table2 b 

2 个答案:

答案 0 :(得分:0)

示例数据不正确,table1中没有London-Berlin组合,结果应为

Rome    Berlin  1
Moscow  Berlin  2
London  Berlin  1

但是可以实现:你想要table2的城市组合,所以基于person将table2连接到自己。

您还想要在table1中加工组合,以便将table1连接到上一个结果。

最后一个结果集需要一个计数器组:

select t2.city, t3.city, count(t1.city1) as counter 
from table2 as t2
inner join table2 as t3 on t2.person = t3.person and t2.city <> t3.city
inner join table1 as t1 on t1.city1 = t2.city and t1.city2 = t3.city
group by t2.city, t3.city

结果将按要求进行,但您必须在table1中输入正确的数据,否则可能会得到错误的结果。

答案 1 :(得分:0)

你可以做到这一点的一种方法是加入每个城市然后聚合,当两个表中都有匹配时计数。这种形式的查询假定第二个表中没有重复:

select t1.city1, t2.city2,
       sum(case when t21.person is not null and t22.person is not null then 1 else 0 end) as cnt
from table1 t1 left outer join
     table2 t21
     on t1.city1 = t21.city left outer join
     table2 t22
     on t1.city1 = t22.city and t22.person = t21.person
group by t1.city1, t2.city2;

编辑:

您也可以使用两个级别的聚合和一个连接来执行此操作。这很容易解释。内部查询计算一个人为每对城市匹配的城市数量。 cnt为0,1或2.外部查询会计算cnt = 2的数字,因为这些是与两个城市匹配的数字。

select city1, city2, sum(case when cnt = 2 then 1 else 0 end) as cnt
from (select t1.city1, t2.city2, person, count(t2.person) as cnt
      from table1 t1 left outer join
           table2 t2
           on t2.city in (t1.city1, t1.city2);

这种方法的优势在于,添加新城市很容易,并且可以获得更多信息,例如有多少人匹配其中一个城市。