我不知道这个标题是否传达了我想要的东西。
我有两个包含电话记录的表格(每个帐户一个),我想获得每个帐户共有的号码的通话计数。换句话说:
表1
Number ...
8675309
8675309
8675310
8675310
8675312
表2
Number ...
8675309
8675309
8675309
8675310
8675311
查询类似的内容:
SELECT DISTINCT table1.number, COUNT(table1.number), COUNT(table2.number) FROM table1, table2 WHERE table1.number = table2.number GROUP BY table1.number
希望产生:
8675309|2|3
8675310|2|1
相反,它目前产生类似的东西:
8675309|6|6
8675310|2|2
它似乎是每个表的计数倍增。据推测,这是因为我没有按照我的目标加入这个目标。或者因为当我要求COUNT(table1.number)时,表格已经以一些乘法的方式加入。我不应该做一个JOIN,而是一个像:“table2.number CONTAINS(table1.number)”?
任何提示?
答案 0 :(得分:1)
一种方法是使用几个派生表分别计算您的计数,然后加入它们以产生最终摘要:
select t1.number, t1.count1, t2.count2
from (select number, count(number) as count1 from table1 group by number) as t1
join (select number, count(number) as count2 from table2 group by number) as t2
on t1.number = t2.number
可能有其他方法,但这应该有效,这是我想到的第一件事。
由于您怀疑的原因,您正在获得“乘法”效果。如果你有这个:
table1(id,x) table2(id,x)
------------ ------------
1, a 4, a
2, a 5, a
3, b 6, b
然后在x
加入他们会给你这个:
1,a, 4,a
1,a, 5,a
2,a, 4,a
2,a, 5,a
...
通常你可以使用GROUP BY来复制重复项,但是你不能这样做,因为它会弄乱你的每个表计数。
答案 1 :(得分:1)
试试这个:
select tab1.number,tab1.num1,tab2.num2
from
(SELECT number, COUNT(number) as num1 from table1 group by number) as tab1
left join
(SELECT number, COUNT(number) as num2 from table2 group by number) as tab2
on tab1.number = tab2.number
答案 2 :(得分:1)
一种方法是使用子查询:
SELECT t1.number, t1.table1Count, t2.table2Count
from (select number, count(*) table1Count
from table1
group by number) t1
inner join (select number, count(*) table2Count
from table2
group by number) t2
on t2.number = t1.number
这假设您只想列出两个表中出现的数字。如果要列出一个表中出现的所有数字,可选择列出另一个表中的数字,则可以使用左外连接或右外连接;如果你想要在一个或两个表中出现的所有数字,你将使用完整的外连接。
另一种可能更有效的方法是需要存在一个唯一标识每个表中每一行的列:
SELECT
t1.number
,count(distinct t1.PrimaryKeyValue) table1Count
,count(distinct t2.PrimaryKeyValue) table2Count
from table1 t1
inner join table2 t2
on t2.number = t1.number
group by t1.number
这与以前的假设相同,也可以通过外连接调整修改。