当前位置: 代码迷 >> Sql Server >> 多条记录合并为一条,同时将连续的编号写成“起始编号-结束编号”的形式解决思路
  详细解决方案

多条记录合并为一条,同时将连续的编号写成“起始编号-结束编号”的形式解决思路

热度:75   发布时间:2016-04-27 19:10:45.0
多条记录合并为一条,同时将连续的编号写成“起始编号-结束编号”的形式
表 a:
编号 值
000055 2
000057 2
000059 2
000060 2
000061 2
000062 2
000063 2
000064 2
000065 3
000066 1
000600 1

要求得到如下结果:
编号 值
000055,000057,000059-000064 2
000065 3
000066,000600 1
将值相同的记录合并成一行,同时将连续的编号写成“起始编号-结束编号”的形式。

------解决方案--------------------
SQL code
---------------------------------------  Author : liangCK 梁爱兰--  Comment: 小梁 爱 兰儿--  Date   : 2009-09-17 16:53:30------------------------------------- --> 生成测试数据: @tbDECLARE @tb TABLE (编号 varchar(6),值 int)INSERT INTO @tbSELECT '000055',2 UNION ALLSELECT '000057',2 UNION ALLSELECT '000059',2 UNION ALLSELECT '000060',2 UNION ALLSELECT '000061',2 UNION ALLSELECT '000062',2 UNION ALLSELECT '000063',2 UNION ALLSELECT '000064',2 UNION ALLSELECT '000065',3 UNION ALLSELECT '000066',1 UNION ALLSELECT '000600',1--SQL查询如下:;WITH Liang AS(    SELECT ROW_NUMBER() OVER(PARTITION BY 值 ORDER BY 值) - 编号 AS rowid,*    FROM @tb),Liang2 AS(    SELECT 值,rowid,CASE WHEN COUNT(*) > 1 THEN RTRIM(MIN(编号))+'~'+RTRIM(MAX(编号))                           ELSE RTRIM(MIN(编号)) END AS flag     FROM Liang     GROUP BY 值,rowid)SELECT     STUFF((SELECT ',' + flag AS [text()] FROM Liang2      WHERE 值 = A.值 FOR XML PATH('')),1,1,'') AS 编号,    值FROM Liang2 AS AGROUP BY 值/*编号    值000600,000066    1000059~000064,000057,000055    2000065    3*/
------解决方案--------------------
SQL code
/*-----------------------------------  Author : htl258(Tony)--  Date   : 2009-09-17 16:53:11--  Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)     Mar 29 2009 10:27:29     Copyright (c) 1988-2008 Microsoft Corporation    Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)---------------------------------*/--> 生成测试数据表:tbIF NOT OBJECT_ID('[tb]') IS NULL    DROP TABLE [tb]GOCREATE TABLE [tb]([编号] NVARCHAR(10),[值] INT)INSERT [tb]SELECT '000055',2 UNION ALLSELECT '000057',2 UNION ALLSELECT '000059',2 UNION ALLSELECT '000060',2 UNION ALLSELECT '000061',2 UNION ALLSELECT '000062',2 UNION ALLSELECT '000063',2 UNION ALLSELECT '000064',2 UNION ALLSELECT '000065',3 UNION ALLSELECT '000066',1 UNION ALLSELECT '000600',1GO--SELECT * FROM [tb]-->SQL查询如下:;WITH t AS(    SELECT CASE WHEN a.编号=b.编号 THEN a.编号 ELSE a.编号+'-'+b.编号 END AS 编号,a.值    FROM (        SELECT rn=ROW_NUMBER()OVER(ORDER BY GETDATE()),*         FROM tb t         WHERE NOT EXISTS(            SELECT 1 FROM tb             WHERE [值]=t.值 AND [编号]=t.[编号]+1)        ) AS a        JOIN (        SELECT rn=ROW_NUMBER()OVER(ORDER BY GETDATE()),*         FROM tb t         WHERE NOT EXISTS(            SELECT 1 FROM tb             WHERE [值]=t.值 AND t.[编号]=[编号]+1)        ) AS b            ON a.rn=b.rn) SELECT DISTINCT 编号=STUFF((SELECT ','+编号 FROM t WHERE 值=a.值 FOR XML PATH('')),1,1,''),值FROM t a/*编号    值000055,000057,000064-000059    2000065    3000066,000600    1*/
------解决方案--------------------
SQL code
sql2000:CREATE TABLE tgss(a VARCHAR(20),b INT)INSERT tgss SELECT '000055',2 union all select '000057', 2 union all select '000059', 2 union all select '000060', 2 union all select '000061', 2 union all select '000062', 2 union all select '000063', 2 union all select '000064', 2 union all select '000065', 3 union all select '000066', 1 union all select '000600', 1ALTER TABLE tgss ADD g INTDECLARE @i INT,@l VARCHAR(20),@sql VARCHAR(2000) SET @i=0UPDATE tgss SET @i=CASE WHEN [email protected]*1+1 THEN @i ELSE @i+1 end,@l=a,[email protected]goSELECT b,g,CASE WHEN MIN(a)=MAX(a) THEN MIN(a) ELSE  MIN(a)+'-'+MAX(a)  END  e into tgssA FROM tgss GROUP BY b,ggoCREATE FUNCTION ltgss(@b INT )RETURNS VARCHAR(1000)AS BEGIN    declare @sql VARCHAR(1000)    SELECT @sql=ISNULL(@sql+',','')+e FROM tgssA WHERE [email protected] ORDER BY g    RETURN @sqlENDgoSELECT b,dbo.ltgss(b) ee FROM tgssA GROUP BY b--result/*b           ee                             ----------- ------------------------------ 1           000066,0006002           000055,000057,000059-0000643           000065(所影响的行数为 3 行)*/
  相关解决方案