如何删除字段里重复的数据(但保留该重复数值),并且按照从小到大的顺序排列在一个字段,还要统计重复数值的个数例如在表tb1里有17778行数据,数据在字段 [notext] 里,TTD字段代表数据的ID,请问如何用sql语句完成以下要求: select '04 13 11 14 09 06 08 13 02 01 13 13 10 09 15'
union all select '13 07 04 00 12 10 12 03 05 05 05 05 08 07 16'
union all select '09 04 13 14 11 10 12 01 04 06 13 13 04 13 03'
union all select '11 07 07 12 10 10 12 02 12 02 11 11 07 06 07'
union all select '10 07 02 14 13 14 00 00 01 02 04 04 03 12 03'
union all select '06 04 10 13 13 15 01 04 01 02 16 16 09 08 10'
union all select '05 04 11 08 09 12 14 11 03 08 10 10 08 07 11'
union all select '08 08 05 12 14 02 04 00 06 03 01 01 05 04 12'
union all select '07 08 01 13 00 05 07 15 08 04 11 11 02 11 13'
union all select '02 04 05 01 05 11 13 01 07 01 08 02 06 05 16'现在需要完成
1、请按照TDD排序(如下图顺序很重要);2、出现数值 00 就删除掉;3、删除重复的数据(但保留该重复数值),并且按照从小到大的顺序排列在一个字段 [MMD]里;4、把重复的数据统计出来,按照重复的次数分别写在字段[RT2],[RT3],[RT4],[RT5],[RT6],[RT7]里,查询结果如下图所示
----[RT2]代表重复2次的数据,[RT3]代表重复3次的数据,以此类推。
可参考http://bbs.csdn.net/topics/390625528?page=1#post-395896477重复数据删除,数据合并,统计
union all select '13 07 04 00 12 10 12 03 05 05 05 05 08 07 16'
union all select '09 04 13 14 11 10 12 01 04 06 13 13 04 13 03'
union all select '11 07 07 12 10 10 12 02 12 02 11 11 07 06 07'
union all select '10 07 02 14 13 14 00 00 01 02 04 04 03 12 03'
union all select '06 04 10 13 13 15 01 04 01 02 16 16 09 08 10'
union all select '05 04 11 08 09 12 14 11 03 08 10 10 08 07 11'
union all select '08 08 05 12 14 02 04 00 06 03 01 01 05 04 12'
union all select '07 08 01 13 00 05 07 15 08 04 11 11 02 11 13'
union all select '02 04 05 01 05 11 13 01 07 01 08 02 06 05 16'现在需要完成
1、请按照TDD排序(如下图顺序很重要);2、出现数值 00 就删除掉;3、删除重复的数据(但保留该重复数值),并且按照从小到大的顺序排列在一个字段 [MMD]里;4、把重复的数据统计出来,按照重复的次数分别写在字段[RT2],[RT3],[RT4],[RT5],[RT6],[RT7]里,查询结果如下图所示
----[RT2]代表重复2次的数据,[RT3]代表重复3次的数据,以此类推。
可参考http://bbs.csdn.net/topics/390625528?page=1#post-395896477重复数据删除,数据合并,统计
create table #tb(id int identity(1,1),notext varchar(100))
insert into #tb(notext)
select'13 07 04 00 12 10 12 03 02 01 13 13 10 09 15'
union all select'09 04 13 14 11 10 12 01 05 05 05 05 08 07 16'
union all select'11 07 07 12 10 10 12 02 04 06 13 13 04 13 03'
union all select'10 07 02 14 13 14 00 00 12 02 11 11 07 06 07'
union all select'06 04 10 13 13 15 01 04 01 02 04 04 03 12 03'
union all select'05 04 11 08 09 12 14 11 01 02 16 16 09 08 10'
union all select'08 08 05 12 14 02 04 00 03 08 10 10 08 07 11'
union all select'07 08 01 13 00 05 07 15 06 03 01 01 05 04 12'
union all select'02 04 05 01 05 11 13 01 08 04 11 11 02 11 13'
union all select'04 07 03 11 00 07 09 01 07 01 08 02 06 05 16'
union all select'01 05 05 11 01 09 11 07 02 01 12 06 04 13 02'
union all select'06 11 01 10 01 10 12 01 03 10 02 12 02 11 16'
union all select'00 06 04 08 00 10 12 08 09 05 04 14 04 13 16'
union all select'00 07 05 04 13 08 10 01 10 02 11 05 03 12 06'
union all select'06 14 06 04 14 10 12 10 06 07 08 02 04 13 16'
union all select'15 08 08 08 03 00 02 00 02 06 02 12 05 14 10'
go
create function dbo.fn_text (@notext varchar(100))
returns varchar(100)
as
begin
declare @t table(col char(2))
declare @s varchar(100),@v varchar(2)
set @s=@notext
while len(@s)>0
begin
set @v=left(@s,2)
if @v<>'00'
insert into @t(col) values(left(@s,2))
set @s=stuff(@s,1,3,'')
endset @s=''
select @s=@s+' '+col from (select distinct col from @t)t order by col
set @s=stuff(@s,1,1,'')
return (@s)end
go
create function dbo.fn_text2 (@notext varchar(100))
returns varchar(100)
as
begin
declare @t table(col char(2))
declare @s varchar(100),@v varchar(2)
set @s=@notext
while len(@s)>0
begin
set @v=left(@s,2)
if @v<>'00'
insert into @t(col) values(left(@s,2))
set @s=stuff(@s,1,3,'')
endset @s=''
select @s=@s+' '+col+'/'+cast(num as varchar)+';' from (select col,count(*) as num from @t group by col having count(*)>1)t order by col
set @s=stuff(@s,1,1,'')
return (@s)end
goselect id ,notext,dbo.fn_text(notext) as MMD,dbo.fn_text2(notext) as TR from #tbdrop function dbo.fn_text
drop function dbo.fn_text2
drop table #tb
/*
id notext MMD TR
-----------------------------------------------------------------------------------------------------------------
1 13 07 04 00 12 10 12 03 02 01 13 13 10 09 15 01 02 03 04 07 09 10 12 13 15 10/2; 12/2; 13/3;
2 09 04 13 14 11 10 12 01 05 05 05 05 08 07 16 01 04 05 07 08 09 10 11 12 13 14 16 05/4;
3 11 07 07 12 10 10 12 02 04 06 13 13 04 13 03 02 03 04 06 07 10 11 12 13 04/2; 07/2; 10/2; 12/2; 13/3;
4 10 07 02 14 13 14 00 00 12 02 11 11 07 06 07 02 06 07 10 11 12 13 14 02/2; 07/3; 11/2; 14/2;
5 06 04 10 13 13 15 01 04 01 02 04 04 03 12 03 01 02 03 04 06 10 12 13 15 01/2; 03/2; 04/4; 13/2;
6 05 04 11 08 09 12 14 11 01 02 16 16 09 08 10 01 02 04 05 08 09 10 11 12 14 16 08/2; 09/2; 11/2; 16/2;
7 08 08 05 12 14 02 04 00 03 08 10 10 08 07 11 02 03 04 05 07 08 10 11 12 14 08/4; 10/2;
8 07 08 01 13 00 05 07 15 06 03 01 01 05 04 12 01 03 04 05 06 07 08 12 13 15 01/3; 05/2; 07/2;
9 02 04 05 01 05 11 13 01 08 04 11 11 02 11 13 01 02 04 05 08 11 13 01/2; 02/2; 04/2; 05/2; 11/4; 13/2;
10 04 07 03 11 00 07 09 01 07 01 08 02 06 05 16 01 02 03 04 05 06 07 08 09 11 16 01/2; 07/3;
11 01 05 05 11 01 09 11 07 02 01 12 06 04 13 02 01 02 04 05 06 07 09 11 12 13 01/3; 02/2; 05/2; 11/2;
12 06 11 01 10 01 10 12 01 03 10 02 12 02 11 16 01 02 03 06 10 11 12 16 01/3; 02/2; 10/3; 11/2; 12/2;
13 00 06 04 08 00 10 12 08 09 05 04 14 04 13 16 04 05 06 08 09 10 12 13 14 16 04/3; 08/2;
14 00 07 05 04 13 08 10 01 10 02 11 05 03 12 06 01 02 03 04 05 06 07 08 10 11 12 13 05/2; 10/2;
15 06 14 06 04 14 10 12 10 06 07 08 02 04 13 16 02 04 06 07 08 10 12 13 14 16 04/2; 06/3; 10/2; 14/2;
16 15 08 08 08 03 00 02 00 02 06 02 12 05 14 10 02 03 05 06 08 10 12 14 15 02/3; 08/3;*/
你看这样统计个数,能够接受吗?
CREATE TABLE #TempA(Id INT IDENTITY(1,1),Notext VARCHAR(100))
INSERT INTO #TempA(Notext)
SELECT'13 07 04 00 12 10 12 03 02 01 13 13 10 09 15'
UNION ALL SELECT'09 04 13 14 11 10 12 01 05 05 05 05 08 07 16'
UNION ALL SELECT'11 07 07 12 10 10 12 02 04 06 13 13 04 13 03'
UNION ALL SELECT'10 07 02 14 13 14 00 00 12 02 11 11 07 06 07'
UNION ALL SELECT'06 04 10 13 13 15 01 04 01 02 04 04 03 12 03'
UNION ALL SELECT'05 04 11 08 09 12 14 11 01 02 16 16 09 08 10'
UNION ALL SELECT'08 08 05 12 14 02 04 00 03 08 10 10 08 07 11'
UNION ALL SELECT'07 08 01 13 00 05 07 15 06 03 01 01 05 04 12'
UNION ALL SELECT'02 04 05 01 05 11 13 01 08 04 11 11 02 11 13'
UNION ALL SELECT'04 07 03 11 00 07 09 01 07 01 08 02 06 05 16'
UNION ALL SELECT'01 05 05 11 01 09 11 07 02 01 12 06 04 13 02'
UNION ALL SELECT'06 11 01 10 01 10 12 01 03 10 02 12 02 11 16'
UNION ALL SELECT'00 06 04 08 00 10 12 08 09 05 04 14 04 13 16'
UNION ALL SELECT'00 07 05 04 13 08 10 01 10 02 11 05 03 12 06'
UNION ALL SELECT'06 14 06 04 14 10 12 10 06 07 08 02 04 13 16'
UNION ALL SELECT'15 08 08 08 03 00 02 00 02 06 02 12 05 14 10' IF OBJECT_ID('tempdb..#TempB','U') IS NOT NULL DROP TABLE #TempB
CREATE TABLE #TempB
(
Rn INT IDENTITY(1,1)
,ID INT
,Num CHAR(2)
)DECLARE @Cnt INT=(SELECT MAX(Id) FROM #TempA)
DECLARE @Txt VARCHAR(200)='',@Num VARCHAR(2)=''WHILE @Cnt>0
BEGIN
SELECT @Txt=Notext FROM #TempA WHERE Id=@Cnt
WHILE LEN(@Txt)>0
BEGIN
SET @Num=left(@Txt,2)
IF @Num<>'00'
INSERT INTO #TempB(ID,Num) VALUES(@Cnt,left(@Txt,2))
SET @Txt=STUFF(@Txt,1,3,'')
END
SET @Cnt=@Cnt-1
ENDIF OBJECT_ID('tempdb..#TempC','U') IS NOT NULL DROP TABLE #TempC
CREATE TABLE #TempC
(
ID INT
,Num CHAR(2)
,Cnt INT
)
INSERT INTO #TempC
SELECT A.ID
,A.Num
,SUM(CASE WHEN A.Num=T.Num THEN 1 ELSE 0 END ) AS Cnt
FROM #TempB AS A
CROSS APPLY (
SELECT B.Num FROM #TempB AS B WHERE A.ID=B.ID AND A.Rn=B.Rn
) AS T
GROUP BY A.ID,A.Num
ORDER BY IDSELECT A.ID
,B.Notext
,B1.Num
,ISNULL(B1.RT2,'') AS [RT2]
,ISNULL(B1.RT3,'') AS [RT3]
,ISNULL(B1.RT4,'') AS [RT4]
,ISNULL(B1.RT5,'') AS [RT5]
,ISNULL(B1.RT6,'') AS [RT6]
,ISNULL(B1.RT7,'') AS [RT7]
FROM #TempC AS A
JOIN #TempA AS B ON A.ID=B.Id
OUTER APPLY (
SELECT Num=STUFF((SELECT ' '+B.Num FROM #TempC AS B WHERE A.ID=B.ID FOR XML PATH('')),1,1,'')
,[RT2]=STUFF((SELECT ' '+C.Num FROM #TempC AS C WHERE A.ID=C.ID AND C.Cnt=2 FOR XML PATH('')),1,1,'')
,[RT3]=STUFF((SELECT ' '+D.Num FROM #TempC AS D WHERE A.ID=D.ID AND D.Cnt=3 FOR XML PATH('')),1,1,'')
,[RT4]=STUFF((SELECT ' '+E.Num FROM #TempC AS E WHERE A.ID=E.ID AND E.Cnt=4 FOR XML PATH('')),1,1,'')
,[RT5]=STUFF((SELECT ' '+F.Num FROM #TempC AS F WHERE A.ID=F.ID AND F.Cnt=5 FOR XML PATH('')),1,1,'')
,[RT6]=STUFF((SELECT ' '+G.Num FROM #TempC AS G WHERE A.ID=G.ID AND G.Cnt=6 FOR XML PATH('')),1,1,'')
,[RT7]=STUFF((SELECT ' '+H.Num FROM #TempC AS H WHERE A.ID=H.ID AND H.Cnt=7 FOR XML PATH('')),1,1,'')
) AS B1
GROUP BY A.ID,B.Notext,B1.Num,B1.RT2,B1.RT3,B1.RT4,B1.RT5,B1.RT6,B1.RT7
insert into #tb
select'13 07 04 00 12 10 12 03 02 01 13 13 10 09 15'
union all select'09 04 13 14 11 10 12 01 05 05 05 05 08 07 16'
union all select'11 07 07 12 10 10 12 02 04 06 13 13 04 13 03'
union all select'10 07 02 14 13 14 00 00 12 02 11 11 07 06 07'
union all select'06 04 10 13 13 15 01 04 01 02 04 04 03 12 03'
union all select'05 04 11 08 09 12 14 11 01 02 16 16 09 08 10'
union all select'08 08 05 12 14 02 04 00 03 08 10 10 08 07 11'
union all select'07 08 01 13 00 05 07 15 06 03 01 01 05 04 12'
union all select'02 04 05 01 05 11 13 01 08 04 11 11 02 11 13'
union all select'04 07 03 11 00 07 09 01 07 01 08 02 06 05 16'
union all select'01 05 05 11 01 09 11 07 02 01 12 06 04 13 02'
union all select'06 11 01 10 01 10 12 01 03 10 02 12 02 11 16'
union all select'00 06 04 08 00 10 12 08 09 05 04 14 04 13 16'
union all select'00 07 05 04 13 08 10 01 10 02 11 05 03 12 06'
union all select'06 14 06 04 14 10 12 10 06 07 08 02 04 13 16'
union all select'15 08 08 08 03 00 02 00 02 06 02 12 05 14 10'
go
--DECLARE @sql VARCHAR(60)='13 07 04 00 12 10 12 03 02 01 13 13 10 09 15'
--SET @sql=REPLACE(@sql,'13','')
--SELECT @sqlcreate function dbo.fn_text (@notext varchar(500))
returns varchar(500)
as
begin
declare @t table(col char(2))
DECLARE @tb TABLE(col1 VARCHAR(50),col2 INT)
declare @s varchar(1000),@v varchar(2)
DECLARE @str VARCHAR(100),@sql VARCHAR(1000)
DECLARE @i INT
DECLARE @j INT
set @s=@notext
while len(@s)>0
begin
set @v=left(@s,2)
if @v<>'00'
insert into @t(col) values(left(@s,2))
set @s=stuff(@s,1,3,'')
endset @s=''
select @s=@s+' '+col from (select DISTINCT col from @t)t order by col
set @s=stuff(@s,1,1,'')
SET @i=0
SET @j=1
SET @sql=''
SET @str=@s
WHILE @i<15
BEGIN
INSERT INTO @tb ( col1, col2 )VALUES (' ', @i)
SET @i=@i+1
END
WHILE LEN(@str)>0
BEGIN
SET @v=LEFT(@str,2)
SET @j=(SELECT COUNT(*) FROM @t WHERE col =@v)
IF @j>1
BEGIN
UPDATE @tb SET col1=col1+@v WHERE col2=@j
END
SET @j=@j+1
SET @str=STUFF(@str,1,3,'')
END
SELECT @sql=@sql+ + '''' + col1 + '''' + ' as col' + CAST(col2 AS CHAR(3)) + ',' FROM (SELECT * FROM @tb) t ORDER BY col2
SET @sql=REPLACE(@sql,'@@','')
SET @sql=SUBSTRING(@sql,0,LEN(@sql)-1)
SET @s='select ' + ''''+ @s + '''' + ' as resurt,' + @sql
return (@s)end
go