Вот решение для SQL Server 2005+. Он использует рекурсивный CTE для подсчета слов
Создание образцов данных и временных таблиц
CREATE Table #Temp ([Count] int, Keyword varchar(max) );
DECLARE @document AS TABLE (
docid INT,
keywords VARCHAR(MAX))
INSERT INTO @document
VALUES (100, 'Test, Document, Info'),
(2010, 'Document, users'),
(4, '....'),
(2340, 'users, client')
Запрос
; WITH cte(docid, word, keywords)
AS (SELECT docid,
LEFT(keywords, Charindex(',', keywords + ',') - 1),
Stuff(keywords, 1, Charindex(',', keywords + ','), '')
FROM @document
UNION ALL
SELECT docid,
LEFT(keywords, Charindex(',', keywords + ',') - 1),
Stuff(keywords, 1, Charindex(',', keywords + ','), '')
FROM cte
WHERE keywords > '')
INSERT INTO #Temp ([Count], Keyword)
SELECT COUNT(docid),
Ltrim(Rtrim(word))
FROM cte
GROUP BY Ltrim(Rtrim(word))
SELECT [Count], Keyword FROM #temp
Выход
Count Keyword
-------- -----
1 ....
1 client
2 Document
1 Info
1 Test
2 users