2013-02-24 75 views
1

我當然希望有人能幫助我解決這個問題。我一直在尋找幾個小時來找到它,但我空着。SQL Server 2008 R2獲取一組文本字符串之間的通用文本

在這個例子中,我有兩列在我的表

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 

所以,我要的是所有出現在每一個串詞該組或組中的常用詞。

+0

'3 Brown'和'3 Medium'是否也是您的答案之一? – Byron 2013-02-24 20:23:30

回答

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}是原始表的名稱。

0

理想情況下,您會標準化您的數據並將這些單詞存儲在單獨的表中。

但是,對於您的直接需求,您首先需要提供一個UDF來將'desc'拆分爲單詞。我挖走this function

-- 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 

其中[集團]是你的表。

相關問題