1

誰かがこの問題で私を助けてくれることを願っています。私はそれを見つけるために何時間も探していましたが、空になってしまいました。

この例では、テーブルに 2 つの列があります

GRP_ID    Desc

私のグループ ID は、これらの製品が同じタイプであることを識別する方法であり、desc はすべての一般的な単語を見つけたいものです。

これが私のテーブルです

GRP_ID          Desc
-------------------------------   
2               Red Hat
2               Green Hat
2               Yellow Hat
3               Boots Large Brown
3               Boots Medium Red
3               Boots Medium Brown

クエリの結果として欲しいものは次のとおりです

GRP_ID           Desc
-----------------------    
2                Hat
3                Boots

だから私が欲しいのは、グループ内のすべての文字列に現れるすべての単語、またはグループ内の共通の単語です。

4

2 に答える 2

0

GRP_ID と製品 (帽子とブーツなど) のマッピング テーブルを作成する必要があると思います。

CREATE TABLE GroupProductMapping (
    GRP_ID INT NOT NULL, -- I'm assuming its an Int
    ProductDesc VARCHAR(50) NOT NULL
)

SELECT a.GRP_ID,
    b.ProductDesc Desc
FROM {Table_Name} a
INNER JOIN GroupProductMapping b ON a.GRP_ID = b.GRP_ID

または、製品が多すぎない場合。SELECT 句で CASE を使用できます。例えば

SELECT 
    GRP_ID,
    CASE GRP_ID 
        WHEN 1 THEN 'Hat' 
        WHEN 2 THEN 'Boots'
    END AS Desc
FROM {Table_Name}

{Table_Name} は元のテーブルの名前です。

于 2013-02-24T22:21:33.570 に答える
0

理想的には、データを正規化し、単語を別のテーブルに保存します。

ただし、差し迫った要件のために、最初に「desc」を単語に分割するための UDF を提供する必要があります。私はこの関数を密猟しました:

-- this function splits the provided strings on a delimiter
-- similar to .Net string.Split.
-- I'm sure there are alternatives (such as calling string.Split through
-- a CLR function).  
CREATE FUNCTION [dbo].[Split]
(    
    @RowData NVARCHAR(MAX),
    @Delimeter NVARCHAR(MAX)
)
RETURNS @RtnValue TABLE 
(
    ID INT IDENTITY(1,1),
    Data NVARCHAR(MAX)
) 
AS
BEGIN 
    DECLARE @Iterator INT
    SET @Iterator = 1

    DECLARE @FoundIndex INT
    SET @FoundIndex = CHARINDEX(@Delimeter,@RowData)

    WHILE (@FoundIndex>0)
    BEGIN
        INSERT INTO @RtnValue (data)
        SELECT 
            Data = LTRIM(RTRIM(SUBSTRING(@RowData, 1, @FoundIndex - 1)))

        SET @RowData = SUBSTRING(@RowData,
                @FoundIndex + DATALENGTH(@Delimeter) / 2,
                LEN(@RowData))

        SET @Iterator = @Iterator + 1
        SET @FoundIndex = CHARINDEX(@Delimeter, @RowData)
    END

    INSERT INTO @RtnValue (Data)
    SELECT Data = LTRIM(RTRIM(@RowData))

    RETURN
END

次に、説明を分割し、いくつかのグループ化を行う必要があります (データが正規化されている場合も同様に行います)。

-- get the count of each grp_id
with group_count as
(
    select grp_id, count(*) cnt from [Group]
    group by grp_id
),
-- get the count of each word in each grp_id
group_word_count as
(
    select count(*) cnt, grp_id, data from 
    (
        select * from [group] g
        cross apply dbo.Split(g.[Desc], ' ') 
    )
    t
    group by grp_id, data
)
-- return rows where number of grp_id = number of words in grp_id
select gwc.GRP_ID, gwc.Data [Desc] from group_word_count gwc 
inner join group_count gc on gwc.GRP_ID = gc.GRP_ID and gwc.cnt = gc.cnt

[Group] はあなたのテーブルです。

于 2013-02-24T22:25:22.390 に答える