解决方案 »

  1.   

    是不是可以理解为按照第二例,只要Atest1前面的几个字母Atest相同的就是一个组?
      

  2.   

    select *,groupid=dense_RANK() over (order by left(var1,4) ) from testdata1 Atest1 Atest1 10,Atest2 12,atest3 22,bbb 13 1
    2 Atest2 Atest1 103,Atest2 12,atest3 33,bbb 13 1
    3 atest3 atest3 33,Atest1 112,Atest2 22,bbb 44 1
    4 Btest1 Btest1 23,Btest2 25 2
    5 Btest1 Btest1 31,Btest2 23 2
    6 Ctest3 Ctest3 23,Ctest4 545 3
      

  3.   


    不是,就是第二列里面按 分号或逗号分隔为多个数据,然后每个数据中空格前的为名称,名称一致的为同一组。
    如 CN12434                        CN12434  222,EN421324 222
    EN421324                      CN12434  222,EN421324 222平常数据是这样的。
      

  4.   


    不是,就是第二列里面按 分号或逗号分隔为多个数据,然后每个数据中空格前的为名称,名称一致的为同一组。
    如 CN12434                        CN12434  222,EN421324 222
    EN421324                      CN12434  222,EN421324 222平常数据是这样的。
    第二列空格前的数据CN12434和第一列相同的为一个组?那你的这个数据,想要的结果是什么?
      

  5.   


    不是,就是第二列里面按 分号或逗号分隔为多个数据,然后每个数据中空格前的为名称,名称一致的为同一组。
    如 CN12434                        CN12434  222,EN421324 222
    EN421324                      CN12434  222,EN421324 222平常数据是这样的。
    第二列空格前的数据CN12434和第一列相同的为一个组?那你的这个数据,想要的结果是什么?是的,第二列空格前和第一列相同的为一个组。
    就是为了分组,原始数据就是这样的,然后我们结果需要确定同组的数据来分析。
      

  6.   


    不是,就是第二列里面按 分号或逗号分隔为多个数据,然后每个数据中空格前的为名称,名称一致的为同一组。
    如 CN12434                        CN12434  222,EN421324 222
    EN421324                      CN12434  222,EN421324 222以上两条属于同一个组平常数据是这样的。
    第二列空格前的数据CN12434和第一列相同的为一个组?那你的这个数据,想要的结果是什么?是的,第二列空格前和第一列相同的为一个组,第二列其实就是组的成员,只不过每个成员后面多了个空格和数字,刚示例的两条属于一个组。。
    就是为了分组,原始数据就是这样的,然后我们结果需要确定同组的数据来分析。CN12434                        CN12434  222,EN421324 222
    EN421324                      CN12434  222,EN421324 222以上两条属于同一个组
      

  7.   

    那好吧
    id          var1                 vargroup                 groupNo
    ----------- -------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1           Atest1               Atest1 10,Atest2 12,atest3 22,bbb 13                 1
    2           Atest2               Atest1 103,Atest2 12,atest3 33,bbb 13                1
    3           atest3               Atest1 112,Atest2 22,atest3 33,bbb 44                1 这几行的groupno为什么是1?
      

  8.   


    vargroup 是当前数据的组成员,用逗号分隔,共有4个(实际数据中只有3个)如果数据中存在 bbb 也属于组1
      

  9.   

    只能说,你这个很难实现。var1 包含不包含在vargroup  这个是筛选和分组没关系,而你的分组时按照vargroup  来进行的,而vargroup  的值不一样,关键后面每个后面有空格和数字,这个比较难替换掉。如果要显示,会比较很麻烦。你可以先筛选,然后使用一个函数把里面的空格和数字去掉,然后再生成分组号。
      

  10.   

    select *,groupid=dense_RANK() over (order by vargroup ) from testdata
      

  11.   


    create table testData(id int,var1 nvarchar(10),vargroup nvarchar(80))insert into testData(id,var1,vargroup)values
    (1,'Atest1','Atest1 10,Atest2 12,atest3 22,bbb 13'),
    (2,'Atest2','Atest1 103,Atest2 12,atest3 33,bbb 13'),
    (3,'atest3','atest3 33,Atest1 112,Atest2 22,bbb 44'),
    (4,'Btest1','Btest1 23,Btest2 25'),   
    (5,'Atest1','Btest1 31,Btest2 23'),
    (6,'Ctest3','Ctest3 23,Ctest4 545'),
    (7,'CN12434','CN12434 222,EN421324 222'),  -- 7,8同组但顺序不定
    (8,'EN421324','EN421324 222,CN12434 222')
    -- 建函数
    create function dbo.fngs
    (@x nvarchar(80)) returns nvarchar(80)
    as
    begin
     declare @r nvarchar(80)
     declare @t table(x nvarchar(80))
     select @x=@x+','
     
     while(charindex(' ',@x,1)>0)
     begin
       select @x=stuff(@x,charindex(' ',@x,1),charindex(',',@x,charindex(' ',@x,1))-charindex(' ',@x,1),'')
     end
     
     insert into @t(x)
     select x
     from
     (select substring(a.s,b.number,charindex(',',a.s+',',b.number)-b.number) 'x'
      from (select left(@x,len(@x)-1) 's') a
      inner join master.dbo.spt_values b
      on b.type='P' and b.number between 1 and len(a.s)
      and substring(','+a.s,b.number,1)=',') t
     order by x 
      
     select @r=isnull(@r,'')+x from @t
     
     return @r
    end
    -- 查询
    select *,
           dense_rank() over(order by dbo.fngs(vargroup)) 'groupNo'
     from testData/*
    id          var1       vargroup                                      groupNo
    ----------- ---------- -------------------------------------------- --------------------
    1           Atest1     Atest1 10,Atest2 12,atest3 22,bbb 13           1
    2           Atest2     Atest1 103,Atest2 12,atest3 33,bbb 13          1
    3           atest3     atest3 33,Atest1 112,Atest2 22,bbb 44          1
    4           Btest1     Btest1 23,Btest2 25                            2
    5           Atest1     Btest1 31,Btest2 23                            2
    7           CN12434    CN12434 222,EN421324 222                       3
    8           EN421324   EN421324 222,CN12434 222                       3
    6           Ctest3     Ctest3 23,Ctest4 545                           4(8 row(s) affected)
    */