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
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
不是,就是第二列里面按 分号或逗号分隔为多个数据,然后每个数据中空格前的为名称,名称一致的为同一组。
如 CN12434 CN12434 222,EN421324 222
EN421324 CN12434 222,EN421324 222平常数据是这样的。
不是,就是第二列里面按 分号或逗号分隔为多个数据,然后每个数据中空格前的为名称,名称一致的为同一组。
如 CN12434 CN12434 222,EN421324 222
EN421324 CN12434 222,EN421324 222平常数据是这样的。
第二列空格前的数据CN12434和第一列相同的为一个组?那你的这个数据,想要的结果是什么?
不是,就是第二列里面按 分号或逗号分隔为多个数据,然后每个数据中空格前的为名称,名称一致的为同一组。
如 CN12434 CN12434 222,EN421324 222
EN421324 CN12434 222,EN421324 222平常数据是这样的。
第二列空格前的数据CN12434和第一列相同的为一个组?那你的这个数据,想要的结果是什么?是的,第二列空格前和第一列相同的为一个组。
就是为了分组,原始数据就是这样的,然后我们结果需要确定同组的数据来分析。
不是,就是第二列里面按 分号或逗号分隔为多个数据,然后每个数据中空格前的为名称,名称一致的为同一组。
如 CN12434 CN12434 222,EN421324 222
EN421324 CN12434 222,EN421324 222以上两条属于同一个组平常数据是这样的。
第二列空格前的数据CN12434和第一列相同的为一个组?那你的这个数据,想要的结果是什么?是的,第二列空格前和第一列相同的为一个组,第二列其实就是组的成员,只不过每个成员后面多了个空格和数字,刚示例的两条属于一个组。。
就是为了分组,原始数据就是这样的,然后我们结果需要确定同组的数据来分析。CN12434 CN12434 222,EN421324 222
EN421324 CN12434 222,EN421324 222以上两条属于同一个组
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?
vargroup 是当前数据的组成员,用逗号分隔,共有4个(实际数据中只有3个)如果数据中存在 bbb 也属于组1
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)
*/