SQL同一字段中有多个值去除重复的值现在表中有一字段LoveSports,里面的值有多个,以,号隔开
但是同一值在这个字段中出现了多次,如羽毛球,羽毛球,篮球,滑冰,篮球
有没有办法将这些重复的值去掉变成羽毛球,篮球,滑冰这样现在表中数据如下样子(表列不只一个,要求查询出表的所有字段信息并能保存为别一张表):孙伟 130000000000 球场 游泳,篮球,羽毛球<N/><N/>,足球,篮球,足球,篮球,游泳,游泳,游泳
王昕 13000229662 松江游泳馆 游泳,滑冰,篮球,足球,羽毛球,游泳,游泳
王超 13001732917 球场 篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球<N/>,羽毛球,篮球,羽毛球,游泳,游泳
凌云 13002105863 源深 篮球,羽毛球,篮球,羽毛球
张伟 13002127937 上海游泳馆 游泳,游泳,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,足球,篮球,羽毛球,篮球,足球,篮球,滑冰,篮球,足球,羽毛球,游泳,滑冰,篮球,足球,羽毛球,游泳,游泳
- 13002139077 上海游泳馆 游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳,游泳
想要的效果是把最后一个字段中,有重复的只要一个各位这个用SQL可以实现吗?如果可以,麻请各位给出代码谢谢如描述不清楚,可加本人QQ540255090在线等!急!!!万分感谢

解决方案 »

  1.   

    给个示例看下:CREATE TABLE TB(ID VARCHAR(6), COLOR NVARCHAR(30))
    INSERT TB
    SELECT '173160',  N'#特深蓝色,#特深蓝色' UNION ALL 
    SELECT '173160',  N'#特深蓝色,#特深蓝色' UNION ALL 
    SELECT '911169',  N'#宝蓝色,#宝蓝色,#花灰色,#花灰色' UNION ALL 
    SELECT '911169',  N'#宝蓝色,#宝蓝色,#花灰色,#花灰色' UNION ALL 
    SELECT '911169',  N'#宝蓝色,#宝蓝色,#花灰色,#花灰色' UNION ALL 
    SELECT '911169',  N'#宝蓝色,#宝蓝色,#花灰色,#花灰色'
    GOCREATE FUNCTION F_getStr(@color nvarchar(30))
    returns nvarchar(30)
    as
    begin
      declare @str nvarchar(30),@temp nvarchar(30)
      set @str=''
      set @temp=''
      while charindex(',', @color+',')>0
      begin
        set @temp=left(@color, charindex(',', @color+',')-1)
        if charindex(','+@temp+',', ','+@str+',')=0
          set @str=@str+','+@temp
        set @color=stuff(@color, 1, charindex(',', @color+','), '')    
      end
      return stuff(@str, 1, 1, '')
    end
    goSELECT ID,dbo.F_getStr(COLOR) as COLOR FROM TBDROP TABLE TB
    DROP FUNCTION F_getStr
    /*
    ID     COLOR
    ------ ------------------------------
    173160 #特深蓝色
    173160 #特深蓝色
    911169 #宝蓝色,#花灰色
    911169 #宝蓝色,#花灰色
    911169 #宝蓝色,#花灰色
    911169 #宝蓝色,#花灰色
    */
      

  2.   

    用函數吧.create  function reny_str(@str varchar(2000)) returns varchar(20)
    as
    begin
     declare @t table(a varchar(200))
     declare @b  table(a varchar(200))
       insert @t
      select substring(@str, number, charindex(',', @str + ',', number) - number)  
      from master..spt_values
      where type='p' 
         and substring(',' + @str, number,1) = ','
     insert into @b  select distinct a   from @t
     declare @a varchar(4000)
      select  @a=isnull(@a+',','')+a  from  @b
     return @a
    endselect  dbo.reny_str('游泳,游泳,游泳')
    --------------
    游泳
      

  3.   


    谢谢,我原先的数据中有些不规则的数据
    像羽毛球,有的是羽毛球,篮球,足球,有的有羽毛球<N/>,篮球,足球或有的是篮球<N/>,羽毛球,足球导致查出来的结果有这样的陈浩 篮球,羽毛球,羽毛球<N/>,足球
    林嘉琪 篮球,羽毛球
    李尧 篮球,羽毛球,游泳
    刘涛 篮球,羽毛球,游泳
    马俊 篮球,羽毛球
    华润涵 滑冰
    刘震 篮球,羽毛球,游泳
    薛飞 篮球,羽毛球,足球
    王旭东 游泳,篮球,羽毛球,滑冰,足球,羽
    这个羽是啥?这个有没有解决方法,忘赐教
      

  4.   

    治本的方法是:规范用户输入(不要有特殊字符,不能有重复名称等),清理脏数据。实在要整理,就逐步处理下。
    比如去掉‘<N />’这种东西:
    update tb
    set col=replace(col,'<N />','')
      

  5.   

    先拆分,去重复,再合并.
    如下两个步骤合并起来做./*
    标题:分拆列值1
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-11-20
    地点:广东深圳
    描述有表tb, 如下:
    id          value
    ----------- -----------
    1           aa,bb
    2           aaa,bbb,ccc
    欲按id,分拆value列, 分拆后结果如下:
    id          value
    ----------- --------
    1           aa
    1           bb
    2           aaa
    2           bbb
    2           ccc
    */--1. 旧的解决方法(sql server 2000)
    SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b SELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)
    FROM tb A, # B
    WHERE SUBSTRING(',' + A.[values], B.id, 1) = ','DROP TABLE #--2. 新的解决方法(sql server 2005) 
    create table tb(id int,value varchar(30))
    insert into tb values(1,'aa,bb')
    insert into tb values(2,'aaa,bbb,ccc')
    go
    SELECT A.id, B.value
    FROM(
        SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
    )A
    OUTER APPLY(
        SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
    )BDROP TABLE tb/*
    id          value
    ----------- ------------------------------
    1           aa
    1           bb
    2           aaa
    2           bbb
    2           ccc(5 行受影响)
    *//*
    标题:按某字段合并字符串之一(简单合并)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-11-06
    地点:广东深圳描述:将如下形式的数据按id字段合并value字段。
    id    value
    ----- ------
    1     aa
    1     bb
    2     aaa
    2     bbb
    2     ccc
    需要得到结果:
    id     value
    ------ -----------
    1      aa,bb
    2      aaa,bbb,ccc
    即:group by id, 求 value 的和(字符串相加)
    */
    --1、sql2000中只能用自定义的函数解决
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    gocreate function dbo.f_str(@id int) returns varchar(100)
    as
    begin
        declare @str varchar(1000)
        set @str = ''
        select @str = @str + ',' + cast(value as varchar) from tb where id = @id
        set @str = right(@str , len(@str) - 1)
        return @str
    end
    go--调用函数
    select id , value = dbo.f_str(id) from tb group by iddrop function dbo.f_str
    drop table tb
    --2、sql2005中的方法
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    goselect id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')
    from tb
    group by iddrop table tb
    --3、使用游标合并数据
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    go
    declare @t table(id int,value varchar(100))--定义结果集表变量
    --定义游标并进行合并处理
    declare my_cursor cursor local for
    select id , value from tb
    declare @id_old int , @id int , @value varchar(10) , @s varchar(100)
    open my_cursor
    fetch my_cursor into @id , @value
    select @id_old = @id , @s=''
    while @@FETCH_STATUS = 0
    begin
        if @id = @id_old
           select @s = @s + ',' + cast(@value as varchar)
        else
          begin
            insert @t values(@id_old , stuff(@s,1,1,''))
            select @s = ',' + cast(@value as varchar) , @id_old = @id
          end
        fetch my_cursor into @id , @value
    END
    insert @t values(@id_old , stuff(@s,1,1,''))
    close my_cursor
    deallocate my_cursorselect * from @t
    drop table tb
      

  6.   

    --你先将拆分的去掉重复的
    select distinct  姓名,手机,球馆,LoveSports
    from tb
    --组合字符
    CREATE FUNCTION dbo.f_tb(@id varchar(10),@shouji varchar(11),@qiuguan varchar(100)) 
    RETURNS varchar(8000) 
    AS 
    BEGIN 
        DECLARE @str varchar(8000) 
        SET @str = '' 
        SELECT @str = @str + ' ' + oveSports FROM tb WHERE  姓名=@id and 手机=@shouji and 球馆=@qiuguan
        RETURN STUFF(@str, 1, 1, '') 
    END 
    GO 
    SELECT 姓名,手机,球馆, LoveSports = dbo.f_tb(姓名,手机,球馆 ) FROM tb GROUP BY  姓名,手机,球馆
    drop table tb 
    drop function dbo.f_tb 
      

  7.   

    --你先将拆分的去掉重复的
    select distinct  姓名,手机,球馆,LoveSports
    from tb
    --组合字符
    CREATE FUNCTION dbo.f_tb(@id varchar(10),@shouji varchar(11),@qiuguan varchar(100)) 
    RETURNS varchar(8000) 
    AS 
    BEGIN 
        DECLARE @str varchar(8000) 
        SET @str = '' 
        SELECT @str = @str + ' ' + oveSports FROM tb WHERE  姓名=@id and 手机=@shouji and 球馆=@qiuguan
        RETURN STUFF(@str, 1, 1, '') 
    END 
    GO 
    SELECT 姓名,手机,球馆, LoveSports = dbo.f_tb(姓名,手机,球馆 ) FROM tb GROUP BY  姓名,手机,球馆
    drop table tb 
    drop function dbo.f_tb 
      

  8.   

    你可以试一下这个SQL语句去除重复的值 select distinct 字段名 from table 
      

  9.   

    楼主还不结帖,答案已经很完整了.
    CREATE TABLE TB(ID VARCHAR(6), COLOR NVARCHAR(30))
    INSERT TB
    SELECT '173160',  N'#特深蓝色,#特深蓝色' UNION ALL 
    SELECT '173160',  N'#特深蓝色,#特深蓝色' UNION ALL 
    SELECT '911169',  N'#宝蓝色,#宝蓝色,#花灰色,#花灰色' UNION ALL 
    SELECT '911169',  N'#宝蓝色,#宝蓝色,#花灰色,#花灰色' UNION ALL 
    SELECT '911169',  N'#宝蓝色,#宝蓝色,#花灰色,#花灰色' UNION ALL 
    SELECT '911169',  N'#宝蓝色,#宝蓝色,#花灰色,#花灰色'
    GOCREATE FUNCTION F_getStr(@color nvarchar(30))
    returns nvarchar(30)
    as
    begin
      declare @str nvarchar(30),@temp nvarchar(30)
      set @str=''
      set @temp=''
      while charindex(',', @color+',')>0
      begin
        set @temp=left(@color, charindex(',', @color+',')-1)
        if charindex(','+@temp+',', ','+@str+',')=0
          set @str=@str+','+@temp
    这一句判断如果无重复值,增加;
        set @color=stuff(@color, 1, charindex(',', @color+','), '') ---设置while循环中@color改变值,相当于游标慢慢地向后移动;   
      end
      return stuff(@str, 1, 1, '')
    end
    goSELECT ID,dbo.F_getStr(COLOR) as COLOR FROM TBDROP TABLE TB
    DROP FUNCTION F_getStr
    /*
    ID     COLOR
    ------ ------------------------------
    173160 #特深蓝色
    173160 #特深蓝色
    911169 #宝蓝色,#花灰色
    911169 #宝蓝色,#花灰色
    911169 #宝蓝色,#花灰色
    911169 #宝蓝色,#花灰色
    */
    我原先的数据中有些不规则的数据 
    像羽毛球,有的是羽毛球,篮球,足球,有的有羽毛球 <N/>,篮球,足球或有的是篮球 <N/>,羽毛球,足球
    === 
    那就在处理前再使用REPLACE等字符串处理函数进行字符串的规范处理.
      

  10.   

    drop table TB
    CREATE TABLE TB(ID VARCHAR(6), COLOR NVARCHAR(100))INSERT TB
    SELECT '173160',  N'游泳,游泳,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球' UNION ALL 
    SELECT '173160',  N'球场    篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球,篮球,羽毛球' 
    select * from TBCREATE FUNCTION F_getStr(@color nvarchar(30))
    returns nvarchar(30)
    as
    begin
      declare @str nvarchar(30),@temp nvarchar(30)
      set @str=''
      set @temp=''
      while charindex(',', @color+',')>0
      begin
        set @temp=left(@color, charindex(',', @color+',')-1)
        if charindex(','+@temp+',', ','+@str+',')=0
          set @str=@str+','+@temp
        set @color=stuff(@color, 1, charindex(',', @color+','), '')    
      end
      return stuff(@str, 1, 1, '')
    end
    goSELECT ID,dbo.F_getStr(COLOR) as COLOR FROM TB
    DROP TABLE TB
    DROP FUNCTION F_getStr
    /*
     ID      Color
    173160 游泳,篮球,羽毛球
    173160 球场    篮球,羽毛球,篮球*/