我想通过计算表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
答案 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);
这种方法的优势在于,添加新城市很容易,并且可以获得更多信息,例如有多少人匹配其中一个城市。