2

多くのフィールドを持つテーブルがありますが、そのテーブルの 3 つのフィールドのすべての単語の数を取得したい

複数回存在するテーブル内のすべてのタイトルを見つける...そのために、このステートメントを発行できます

SELECT title, COUNT(title) AS NumOccurrences FROM users
GROUP BY titleHAVING ( COUNT(title) > 1 )

テーブルにtitle,url,description という3 つのフィールドがあるとします。基本的に、そのテーブルの最大時間のどの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
4

2 に答える 2

2

UNION を使用して 3 つのフィールドを 1 つの列に結合する必要があるため、これを使用してグループ化できます。また、単語が最も多く出現する場所をドリルダウンする必要がある場合に備えて、さらにいくつかのカウントを追加しました。

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 の新しいバージョンへのアップグレードを強く検討してください。

于 2012-07-04T06:56:07.330 に答える
1

LEN()同じフィールドに単語が複数回出現することを考慮して、 の差を使用して、単語が 3 つのフィールドにまたがる出現回数を数えることができます。

SELECT
    a.wordname,
    SUM(
        ((LEN(b.title) - LEN(REPLACE(b.title, a.wordname, ''))) / LEN(a.wordname)) +
        ((LEN(b.url) - LEN(REPLACE(b.url, a.wordname, ''))) / LEN(a.wordname)) +
        ((LEN(b.description) - LEN(REPLACE(b.description, a.wordname, ''))) / LEN(a.wordname))
    ) AS occurrence
FROM
    (
        SELECT 'sqlserver' AS wordname UNION ALL
        SELECT 'jquery' AS wordname UNION ALL
        SELECT 'ajax' AS wordname
    ) a
CROSS JOIN
    users b
GROUP BY
    a.wordname
ORDER BY
    occurrence DESC

SELECT ... UNION ALL単語名の表がある場合は、例として挙げた多くのステートメントの代わりにその表名を入れてください。

于 2012-07-04T07:12:25.563 に答える