2011-06-24 5 views
1

その表題が望むものを伝えるかどうかはわかりません。列が別々の表に共通する異なる表の異なる値をカウントします

電話記録を含む2つのテーブル(アカウントごとに1つずつ)があり、それぞれのアカウントに共通する番号のコールカウントを取得したいと考えています。以下のようなもので照会

表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 
を10

代わりに、それは現在のようなものを生成します。

それは各テーブルからのカウントを掛けるように見える
8675309|6|6 
8675310|2|2 

。おそらく、私はこの目標のためにテーブルに参加していないからです。または、私がCOUNT(table1.number)を求めるときには、テーブルはすでにいくつかの乗法的な方法で結合されているからです。 JOINではなく、「table2.number CONTAINS(table1.number)」のようなものを読み込む必要がありますか?

ヒント?

答えて

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 

これは、あなただけの両方のテーブルに表示される数字を一覧表示することを前提としています。 1つのテーブルに表示されるすべての数値をリストしたい場合は、別のテーブルに表示する必要がある場合は、左または右の外部結合を使用します。いずれかまたは両方の表に表示されているすべての数値が必要な場合は、完全外部結合を使用します。

別の、潜在的に、より効率的な方法は、一意の各テーブルの各行を識別する単一列の存在を必要とする:

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 

これは前と同じ仮定を行い、また、外部結合を介して修飾さを調整することができます。

+0

ありがとうございます、あなたの最初のソリューションは素晴らしい作品です。私はこのようなユニークな列を持っているので、作業するための2番目のオプションを取得しようとしていますが、タイプされているので、「:構文エラー」に「エラー:近く」が表示されます。私は "内部"の後に "結合"を追加しようとしましたが、それはちょうどそれぞれの数のためのカウントではなく、合計の数を示すようです。 そこにいくつかの光を当てることができれば嬉しいですが、最初の解決策は素晴らしいです。 ありがとうございます。 – fracai

+0

私はその2番目のクエリを修正しました。あなたが見つけたとき、私は "参加"を忘れていました。また、必要な 'group by'節も欠席しました。改訂版は今すぐ動作するはずです。 –

+0

優秀、ありがとう。 – fracai

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 

は、他の方法は、おそらくありますが、それは動作するはずですし、それが最初であります心に来た事。

疑わしい理由から、「乗法」効果がかなり得られます。あなたは、このお持ちの場合:

1,a, 4,a 
1,a, 5,a 
2,a, 4,a 
2,a, 5,a 
... 

通常あなたが重複を整理してGROUP BYを使用することができますが、それので、それを行うことはできません。

table1(id,x) table2(id,x) 
------------ ------------ 
1, a   4, a 
2, a   5, a 
3, b   6, b 

を次にx上でそれらに参加することは、あなたにこれを与えますあなたのテーブルごとのカウントを台無しにするでしょう。

+0

ああ、乗算とGROUP BYに関する説明をありがとう。 – fracai

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 
関連する問題