数据库中多行数据合并成一行

最近做项目的时候有一个查询页面,查询结果中有几行数据,前面的列都相同,只是最后一列的Country不同,所以会显示多条数据,现打算把具有相同ID的不同Country合并成一条数据,并显示该ID对应的所有的Country。

实现之前的效果是:

数据库中多行数据合并成一行     

欲实现的效果是(此处的分隔符 ‘/’ 可以替换成想要的字符):

 数据库中多行数据合并成一行

现列举数据库的三个表关系如下:

数据库中多行数据合并成一行

接下来介绍一下实现的存储过程:

数据库中多行数据合并成一行
 1 USE [LenovoChecklist]
 2 GO
 3 /****** Object:  StoredProcedure [dbo].[PROC_yangzehuatest]    Script Date: 03/12/2014 11:18:33 ******/
 4 SET ANSI_NULLS ON
 5 GO
 6 SET QUOTED_IDENTIFIER ON
 7 GO
 8 
 9 ALTER PROCEDURE [dbo].[PROC_yangzehuatest]
10     
11     @projectid int 
12     --@AllNames nvarchar(500) = ‘‘ output --此注释部分可以供其他sql语句调用,在项目中暂时没用到
13 AS
14 BEGIN
15 
16 --声明变量
17     declare @countrynames nvarchar(500) ;
18     set @countrynames=‘‘;
19     declare @tempname nvarchar(50);    
20     
21 --声明临时表
22    declare @temptable TABLE
23    (
24    tempid int identity(1,1),
25    pro_id int ,
26    ProjectName nvarchar (50),
27    CountryName nvarchar(50)
28    ) ;
29     
30 --插入临时表                
31      Insert into @temptable (pro_id, ProjectName,CountryName) 
32      SELECT CL_Project.ProjectID, CL_Project.ProjectName,CL_Country.CountryName                
33      FROM         CL_Country INNER JOIN
34           CL_ProjectCountry ON CL_Country.CountryID = CL_ProjectCountry.CountryID INNER JOIN
35           CL_Project ON CL_ProjectCountry.ProjectID = CL_Project.ProjectID
36      where CL_Project.ProjectID =@projectid 
37                                                      
38 --遍历临时表
39       while exists(select CountryName from @temptable where pro_id=@projectid)
40       begin
41           --获取CountryName并拼接到@countrynames                     
42           set  @tempname = (select top(1) CountryName from @temptable  where pro_id=@projectid);
43           set @countrynames=@countrynames+/+@tempname; 
44           --遍历过一条之后删除该条数据,继续遍历                    
45           delete @temptable   where tempid=(Select top (1) tempid from @temptable);
46       end
47       
48 --删除第一个‘/‘
49       if (LEN(@countrynames)>1)
50       set @countrynames=SUBSTRING(@countrynames,2,LEN(@countrynames)-1);
51       else
52       set @countrynames=no country;
53       
54       select @projectid as ProjectID, @countrynames as CountryName ;
55       -- set @AllNames=@countrynames; --此注释部分可以供其他sql语句调用,在项目中暂时没用到
56                       
57    
58 END
数据库中多行数据合并成一行

 

至此,希望有所帮助。

数据库中多行数据合并成一行,布布扣,bubuko.com

数据库中多行数据合并成一行

上一篇:dataguard switchover to physical stnadby


下一篇:SQL SERVER中CUME_DIST和PERCENT_RANK函数