我有一个包含许多字段的表,但我想获取该表中任意三个字段中每个单词的计数
查找表中多次存在的所有标题...因此我可以发出此语句
SELECT title, COUNT(title) AS NumOccurrences FROM users
GROUP BY titleHAVING ( COUNT(title) > 1 )
假设我的表有三个字段,分别为标题、url、描述。 基本上我不知道哪个单词在该表的哪 3 个字段中存储的时间最长。
我想发出一个sql语句,它可以显示哪个单词找到最长时间...就像
word-name occurance
--------- -------
sqlserver 300
jquery 120
ajax 110
请指导我使用 sql server 2000/2005 的示例 sql,谢谢
这是我更新的完整代码......请查看
IF OBJECT_ID('tempdb..#tempSearch') IS NOT NULL
BEGIN
DROP TABLE #tempSearch
END
CREATE TABLE #tempSearch(
ID INT,
Title nvarchar(4000),
Description ntext,
Url nvarchar(4000),
Type char(1))
INSERT INTO #tempSearch
SELECT * from vwProductSearch
INSERT INTO #tempSearch
SELECT * from vwContentSearch
SELECT Word,
COUNT(Word) AS TotalOccurrences,
COUNT(CASE WHEN Field = 'Title' THEN Word END) AS OccurancesInTitle,
COUNT(CASE WHEN Field = 'URL' THEN Word END) AS OccurancesInURL,
COUNT(CASE WHEN Field = 'Description' THEN Word END) AS OccurancesInDescription
FROM ( SELECT CONVERT(NTEXT, Title) AS Word, 'Title' AS Field
FROM #tempSearch
UNION ALL
SELECT CONVERT(NTEXT, URL), 'URL' AS Field
FROM #tempSearch
UNION ALL
SELECT CONVERT(NTEXT, Description), 'Description' AS Field
FROM #tempSearch
) As Fields
GROUP BY Word
HAVING COUNT(Word) > 1
DROP TABLE #tempSearch
最佳答案
您需要使用 UNION 将 3 个字段合并为一列,以便可以使用它进行分组。我还添加了更多计数,以防您需要深入了解该单词出现最多的位置。
SELECT Word,
COUNT(Word) AS TotalOccurrences,
COUNT(CASE WHEN Field = 'Title' THEN Word END) AS OccurancesInTitle,
COUNT(CASE WHEN Field = 'URL' THEN Word END) AS OccurancesInURL,
COUNT(CASE WHEN Field = 'Description' THEN Word END) AS OccurancesInDescription
FROM ( SELECT Title AS Word, 'Title' AS Field
FROM Users
UNION ALL
SELECT URL, 'URL' AS Field
FROM Users
UNION ALL
SELECT Description, 'Description' AS Field
FROM Users
) As Fields
GROUP BY Word
HAVING COUNT(Word) > 1
编辑
我知道您曾询问过有关 SQL_Server 2005 和 2000 的问题,但如果您要升级到 2008 或更高版本,有一个更简洁的解决方案:
SELECT Word,
COUNT(Word) AS TotalOccurrences,
COUNT(CASE WHEN Field = 'Title' THEN Word END) AS OccurancesInTitle,
COUNT(CASE WHEN Field = 'URL' THEN Word END) AS OccurancesInURL,
COUNT(CASE WHEN Field = 'Description' THEN Word END) AS OccurancesInDescription
FROM Users
CROSS APPLY
( VALUES
(Title, 'Title'),
(URL, 'URL'),
(Description, 'Description')
) AS T (Word, Field)
GROUP BY Word
HAVING COUNT(Word) > 1
编辑2
如果您的所有列都是不同的数据类型,您将需要显式转换它们:
SELECT Word,
COUNT(Word) AS TotalOccurrences,
COUNT(CASE WHEN Field = 'Title' THEN Word END) AS OccurancesInTitle,
COUNT(CASE WHEN Field = 'URL' THEN Word END) AS OccurancesInURL,
COUNT(CASE WHEN Field = 'Description' THEN Word END) AS OccurancesInDescription
FROM ( SELECT CONVERT(NTEXT, Title) AS Word, 'Title' AS Field
FROM Users
UNION ALL
SELECT CONVERT(NTEXT, URL), 'URL' AS Field
FROM Users
UNION ALL
SELECT CONVERT(NTEXT, Description), 'Description' AS Field
FROM Users
) As Fields
GROUP BY Word
HAVING COUNT(Word) > 1
编辑3
无法解决您遇到的错误,您无法按 NTEXT 进行分组。我能想到的最好的解决方案感觉很脏,而且我对此不是特别满意......
SELECT COALESCE(Title, URL, Description) AS Word,
COALESCE(Title.Occurances, 0) + COALESCE(URL.Occurances, 0) + COALESCE(Description.Occurances, 0) AS TotalOccurances,
COALESCE(Title.Occurances, 0) AS TitleOccurances,
COALESCE(URL.Occurances, 0) AS URLOccurances,
COALESCE(Description.Occurances, 0) AS DescriptionOccurances
FROM ( SELECT CONVERT(NTEXT, Title) AS Title, COUNT(*) AS Occurances
FROM #tempSearch
GROUP BY Title
) AS Title
FULL JOIN
( SELECT CONVERT(NTEXT, URL) AS URL, COUNT(*) AS Occurances
FROM #tempSearch
GROUP BY URL
) AS URL
ON URL LIKE Title
FULL JOIN
( SELECT Description, 1 AS Occurances
FROM #tempSearch
) AS Description
ON Description LIKE Title
这可行,但正如我所说,它并不完美,并且可能不会表现得很好。强烈考虑升级到更高版本的 SQL-Server!
关于sql - 如何查找sql server表的三个字段中出现次数最多的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11323769/