计算不同表中的不同值,其中列对于单独的表是通用的

时间:2011-06-24 20:31:53

标签: sql sqlite

我不知道这个标题是否传达了我想要的东西。

我有两个包含电话记录的表格(每个帐户一个),我想获得每个帐户共有的号码的通话计数。换句话说:

表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)”?

任何提示?

3 个答案:

答案 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

这与以前的假设相同,也可以通过外连接调整修改。