sql - 如何查找sql​​ server表的三个字段中出现次数最多的单词

标签 sql sql-server t-sql count

我有一个包含许多字段的表,但我想获取该表中任意三个字段中每个单词的计数

查找表中多次存在的所有标题...因此我可以发出此语句

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/

相关文章:

mysql - 按行分割的平均响应是多少?

sql - 将数据框与左侧或右侧的 Pandas 合并

sql - 多个日期范围之间的分钟总和

sql-server-2005 - 如何在单个查询中从子表和父表中删除记录?

sql-server - 每晚将 Excel 电子表格导入 mysql 数据库

sql - 将 Oracle 中的 CONNECT_BY_ISLEAF 替换为 Postgres

sql - 使用Oracle LISTAGG函数消除重复项

sql - 为一组 SQL 语句分配一个数字分数

c# - signalR 和 SQL 底板向组发送消息

如果另一个表中不存在对应的值,则 SQL 选择值