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

最近做项目的时候有一个查询页面,查询结果中有几行数据,前面的列都相同,只是最后一列的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

 

至此,希望有所帮助。

 

 

转载于:https://www.cnblogs.com/yangzehua/p/3596396.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值