2017-02-09 1 views
-1

После поиска в Интернете я могу с уверенностью сказать, что я не могу найти другое сообщение где-нибудь с этой же проблемой, поэтому позвольте мне объяснить, что я пытаюсь сделать.SQLite, подсчитывающий происхождение имен из одной таблицы против строки имени в другой таблице

Что я хочу сделать, это выбрать все имена из таблицы Members и подсчитать, сколько раз каждое из этих имен появляется в столбце строки в таблице вызовов.

ПРИМЕЧАНИЕ. Столбец Members в таблице вызовов является varchar, который получает конкатенированную строку из моего приложения.

 Member Table     Call Table 

FirstName  LastName    Members      Officers 
--------  --------    -------      -------- 
John   Smith     John Smith,John Smith2  John Smith 
John   Smith2    John Smith,John Smith3  John Smith2 
John   Smith3    John Smith2     John Smith,John Smith3 
John   Smith4    John Smith2,John Smith3  John Smith3 

Что я хочу:

FullName    nameCount 
--------    --------- 
John Smith    4 
John Smith2    5 
John Smith3    4 
John Smith4    0 

Я не был очень успешным с подходами, которые я видел в других местах. Любая помощь будет большой.

+0

Вы говорите, что не можете найти подходы в другом месте, но затем говорите, что вы не добились успеха с ними. Это прямая проблема - что вы делали, что не сработало. – Hogan

+0

Я попытался разобрать столбцы Members, а затем использовать счетчик, но даже не смог их успешно разобрать, так как SQLite не имеет Split, CharIndex или Left. – RockGuitarist1

+1

Эти проблемы возникают, когда вы помещаете несколько значений в один столбец вместо правильной нормализации данных. Добавьте таблицу «участники вызова» с несколькими строками на вызов. –

ответ

1

Это не будет быстрым, но вы можете присоединиться таблицы, используя дикие карты - как этот

SELECT * 
FROM Member M 
JOIN Call C ON C.Members LIKE '%' ||M.FirstName || ' ' || M.LastName || '%' 

Это даст вам все места в таблице вызовов для всех членов.

Теперь просто группируйтесь и считайте.

SELECT M.FirstName || ' ' || M.LastName as FullName, COUNT(*) as nameCount 
FROM Member M 
JOIN Call C ON C.Members LIKE '%' ||M.FirstName || ' ' || M.LastName || '%' 
GROUP BY M.FirstName || ' ' || M.LastName 

Повторное чтение вашего вопроса Я не 1, 2, 3 в конце имен. Большинство данных не нравится это, но если у вас есть, то вам нужно, чтобы защититься от него - как это:

SELECT M.FirstName || ' ' || M.LastName as FullName, COUNT(*) as nameCount 
FROM Member M 
JOIN Call C ON (C.Members LIKE '%' ||M.FirstName || ' ' || M.LastName || ',%') OR 
       (C.Members LIKE '% ' ||M.FirstName || ' ' || M.LastName) 

GROUP BY M.FirstName || ' ' || M.LastName 

Это выглядит только для имен с , после них или пространство перед ними.

+0

Моя ошибка с моей стороны. Моя коллекция имен не содержит пробела после каждого имени. С учетом сказанного я изменил его на Left Join, чтобы я мог получить все 27 имен из моей таблицы Members, вместо 14, которые я получал с обычным Join, и все имена появляются, но все они имеют Count of 1. Покажите обновленный запрос выше. – RockGuitarist1

+0

Вы ожидали, что у них будет более высокий показатель? – Hogan

+0

Это работает для некоторых имен, но есть несколько имен, которые появляются с меньшим количеством таблиц, чем должно быть. Кроме того, я работаю над тем, чтобы колонка «Офицеры» включалась в этот счет и также включала имена, в которых есть 0 в Count. – RockGuitarist1