2016-12-22 3 views
1

У меня есть следующие две таблицы,SQL объединить две таблицы и получить кумулятивный подсчет

таблица 1:

id document 
-------------- 
A3 B2 
A3 B400 
A5 B100 
A5 B500 
A7 B200 
A8 B6 
A8 B2 
A8 C1  
A8 B3 

Таблица 2:

id name 
-------------- 
A1 Jack 
A2 Martin 
A3 Jack 
A4 Thomas 
A5 Jack 
A6 Thomas 
A7 Thomas 
A8 John 
A9 John 
A10 Kate 

мой фильтр является следующее, что следует сравнить колонку document и фильтр на основе этого списка:

WHERE table1.document IN (B2,B400,B100,B500,B200,B6,B2,B3) 

результат должен быть как:

name freq 
-------------- 
Jack 4 
Thomas 1 
John 3 

объяснения: Сначала я фильтровать документы у меня есть в моей статье WHERE IN. Затем я посмотрю на соответствующее значение id в столбце table1 и . Посмотрите, что id во второй таблице, первом столбце, и получите соответствующий name для этого идентификатора и поместите его в таблицу результатов.
Например, А3 повторяется дважды, и его соответствующий name является Jack, так что ДО Теперь Джек имеет значение 3 в freq колонке, но со следующего идентификатора в мой таблица1 А5, повторяется дважды, что случается, чтобы иметь Jack как его название, так что тогда jack будет иметь 4 в качестве частоты.
Для следующего значения в таблице 1 A7 имеет соответствующее имя Thomas, так как A7 повторяется один раз, и ни один другой идентификатор, соответствующее ему имя Thomas , отсутствует в моем списке таблицы1, тогда у Тома будет частота 1 (I не имеют A4, ни A6 в таблице 1).
И в последнем примере у меня A8 повторяется 4 раза в таблице1, но, поскольку мой список в WHERE IN не содержит C1, так что запись будет отфильтрована и не засчитана, поэтому у меня осталось три A8, чьи имя John, а затем он получает значение 3.

здесь является demo данных.

ответ

5

Это кажется простым JOIN с GROUP BY может дать необходимые результаты:

SELECT t2.name, COUNT(*) AS freq 
FROM table1 AS t1 
JOIN table2 AS t2 ON t1.id = t2.id 
WHERE t1.document IN ('B2','B400','B100','B500','B200','B6','B2','B3') 
GROUP BY t2.name; 
+0

спасибо за очаровательный ответ. – passion

+1

@marcel Привет, я постараюсь вернуться к вам для остальных вопросов, как только найду свободное время. Ваши сообщения всегда интригуют. –