Подсчитывает различные значения в разных таблицах, где столбцы являются общими для отдельных таблиц. - PullRequest
1 голос
/ 25 июня 2011

Понятия не имею, передает ли этот заголовок то, что я хочу.

У меня есть две таблицы с телефонными записями (по одной для каждой учетной записи), и я хотел бы получить количество вызовов для номеров, которые являются общими для каждой учетной записи. Другими словами:

Таблица 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 ]

1 голос
/ 25 июня 2011

Попробуйте это:

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
1 голос
/ 25 июня 2011

Один способ с подзапросами:

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

Это делает те же предположения, что и раньше, и также может быть скорректировано с помощью внешних объединений.

1 голос
/ 25 июня 2011

Один из способов - использовать пару производных таблиц для вычисления ваших подсчетов отдельно, а затем объединить их для получения окончательного результата:

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 для сортировки дубликатов, но вы не можете сделать это, потому что это может испортить количество ваших таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...