2015-02-17 1 views
2

Хорошо, я могу задавать очень глупый вопрос, но каким-то образом я не могу получить способ выполнить следующее.Искать строку в текстовом столбце и перечислить число

У меня есть таблица, которая содержит два столбца, как показано ниже

+-------+-------------------------------------------------------------------------------------------------------------------------------------------------+ 
| SL No |                  Work                  | 
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------+ 
|  1 | Identify Process Champs across all teams for BCUK processes                      | 
|  2 | Impart short training on FMEA to all the Process Champs                       | 
|  2 | List down all critical steps involved in the Process to ascertain the risk involved, feed the details back to FMEA template to analyze the risk | 
|  3 | Prioritize the process steps based on Risk Priority Number                      | 
|  4 | Identity the Process Gaps, suggest process improvement ideas to mitigate/mistake proof or reduce the risk involved in the process    | 
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------+ 

Теперь у меня есть другая таблица, которая удерживает «Ключевые слова», как показано ниже

+-------+----------+ 
| Sl No | Tags | 
+-------+----------+ 
|  1 | BCUK  | 
|  2 | FMEA  | 
|  3 | Priority | 
|  4 | Process | 
+-------+----------+ 

Теперь я хотел бы «Искать String "в первой таблице на основе" тегов "во второй таблице и вернуть что-то вроде этого

+----------+-------+ 
| Tags | Count | 
+----------+-------+ 
| BCUK  |  1 | 
| FMEA  |  2 | 
| Priority |  1 | 
| Process |  8 | 
+----------+-------+ 

Как "Process" появляется ключевое слово eight times всей таблицы (первой таблицы) через несколько строк она возвращает количество как 8.

Я использую SQL Server 2014 Express Edition

+0

Есть не включается в таблицу? как они связаны? Ок - нет соединения между двумя таблицами? – DevelopmentIsMyPassion

+0

Ваша колонка действительно текстовая колонка? –

+1

Диск с комментариями, поскольку у меня нет времени для правильного ответа: это похоже на работу для 'CROSS APPLY'. –

ответ

2

Адам Machanic имеет функцию GetSubstringCount для такого рода операций. Я немного изменил его для ваших нужд. Для получения дополнительной информации: http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/counting-occurrences-of-a-substring-within-a-string.aspx

SAMPLE DATA

CREATE TABLE MyTable(
    SLNo INT, 
    Work VARCHAR(4000) 
) 
INSERT INTO MyTable VALUES 
(1, 'Identify Process Champs across all teams for BCUK processes'), 
(2, 'Impart short training on FMEA to all the Process Champs'), 
(2, 'List down all critical steps involved in the Process to ascertain the risk involved, feed the details back to FMEA template to analyze the risk'), 
(3, 'Prioritize the process steps based on Risk Priority Number'), 
(4, 'Identity the Process Gaps, suggest process improvement ideas to mitigate/mistake proof or reduce the risk involved in the process'); 

CREATE TABLE KeyWord(
    SLNo INT, 
    Tag  VARCHAR(20) 
) 
INSERT INTO KeyWord VALUES 
(1, 'BCUK'), 
(2, 'FMEA'), 
(3, 'Priority'), 
(4, 'Process'); 

РЕШЕНИЕ

;WITH E1(N) AS(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
) 
,E2 AS(SELECT 1 AS N FROM E1 a, E1 b) 
,E4 AS(SELECT 1 AS N FROM E2 a, E2 b) 
,Tally(N) AS(
    SELECT TOP(11000) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))FROM E4 a, e4 b 
) 
SELECT 
    k.Tag, 
    [Count] = SUM(x.cc) 
FROM KeyWord k 
CROSS JOIN MyTable m 
CROSS APPLY(
    SELECT COUNT(*) AS cc 
    FROM Tally 
    WHERE 
     SUBSTRING(m.Work, N, LEN(k.tag)) = k.tag 
)x 
GROUP BY k.tag 

РЕЗУЛЬТАТ

Tag     Count 
-------------------- ----------- 
BCUK     1 
FMEA     2 
Priority    1 
Process    8 
+0

, чтобы каждый символ мог найти совпадения, но я думаю, что это медленно. –

+0

Как это зацикливание? –

+0

проверка от первого символа, второго символа, третьего символа ..... –

1

Вместо подсчета совпадений я заменяю их дополнительным символом и сравнивая длину с исходной длиной. Таким образом, подсчет очень прост и быстр.

Тестовые таблицы и данные

DECLARE @texts table(SL_No int identity(1,1),Work varchar(max)) 

INSERT @texts VALUES 
    ('Identify Process Champs across all teams for BCUK processes'), 
    ('Impart short training on FMEA to all the Process Champs'), 
    ('List down all critical steps involved in the Process to ascertain the risk involved, feed the details back to FMEA template to analyze the risk'), 
    ('Prioritize the process steps based on Risk Priority Number'), 
    ('Identity the Process Gaps, suggest process improvement ideas to mitigate/mistake proof or reduce the risk involved in the process') 

DECLARE @searchvalues table(S1_No int identity(1,1),Tags varchar(max)) 

INSERT @searchvalues 
VALUES('CUK'),('FMEA'),('Priority'),('Process') 

Запрос:

SELECT 
    sum(len(replace(txt.work, sv.tags, sv.tags + '@')) - len(txt.work)) count, 
    tags 
FROM 
    @texts txt 
CROSS APPLY 
    @searchvalues sv 
WHERE charindex(sv.tag, txt.work) > 0 
GROUP BY tags 

Результат:

count tags 
1 CUK 
2 FMEA 
1 Priority 
8 Process