惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
博客园_首页
博客园 - 聂微东
T
Tailwind CSS Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
The Cloudflare Blog
aimingoo的专栏
aimingoo的专栏
Martin Fowler
Martin Fowler
D
Docker
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
Microsoft Azure Blog
Microsoft Azure Blog
Recent Announcements
Recent Announcements
Apple Machine Learning Research
Apple Machine Learning Research
阮一峰的网络日志
阮一峰的网络日志
B
Blog RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
Jina AI
Jina AI
博客园 - Franky
D
DataBreaches.Net

博客园 - CrazyWill

VBscript(ASP)计算程序运行时间,精度到毫秒 VBscript(ASP)常用函数 301永久重定向实现方式及302重定向 开源搜索引擎资源 18种方法让你集中精力工作 IE的BUG - CrazyWill - 博客园 弱智的卡巴死机 bash比较文件时间和当前时间 - CrazyWill - 博客园 老问题: SQL server 2000安装过程中错误解决 使用TELNET手工操作 IMAP 查看邮件 安装 samba 记录 使用TELNET手工操作 SMTP/POP 收发邮件 SQL语句实现横排 2 世界 Web 2.0 网站评奖揭晓 MagicAjax使用简介 [链接]什么是Web 2.0——下一代软件的设计模式和商业模式 SQL语句实现横排 WEB页面统一认证登录方法 一道有趣的C#考试题目
SQL语句实现合并数据(原创)
CrazyWill · 2006-02-20 · via 博客园 - CrazyWill

SQL语句实现合并数据(原创)


有一个表:  
DepID         StaffName
----------------------  
101            AAAaa
101            BBBb
101            CCCccc
202            DDDddd
202            EEE
202            FFF
303            GGGGG

表说明,DepID为部门ID,StaffName为员工姓名,一个部门当然会有0..N多个员工 :)

用SQL语句如何将上面的表变成下面组合起来的方式呢。  
DepID        StaffNames
-------------------  
101 AAAaa;BBBb;CCCccc
202 DDDddd;EEE;FFF
303 GGGGG

先创建以上的测试数据表

if  exists(select  name  from  sysobjects  where  name='DepStaffs'  and  xtype='U')   
     
drop  table  DepStaffs   
  
create  table  DepStaffs(   
   DepID  
int  not  null,   
   StaffName  
varchar(30)  not  null,   
)   
go   
  
insert  DepStaffs  values(101,'AAAaa')
insert  DepStaffs  values(101,'BBBb')
insert  DepStaffs  values(101,'CCCccc')
insert  DepStaffs  values(202,'DDDddd')
insert  DepStaffs  values(202,'EEE')
insert  DepStaffs  values(202,'FFF')
insert  DepStaffs  values(303,'GGGGG')

创建一个SQLSERVER数据库的用户自定义函数:

CREATE FUNCTION [dbo].[FN_GetDepStaffNamesByDepID]
(
    
@DepID int
)
RETURNS [nvarchar](4000)
AS
BEGIN
    
DECLARE @ReturnValue [nvarchar](4000)
    
SET @ReturnValue = ''
    
SELECT @ReturnValue=@ReturnValue + LTRIM(RTRIM(DepStaffs.StaffName))  + ';'
         
FROM DepStaffs
        
WHERE DepStaffs.DepID = @DepID
    
SET @ReturnValue = ISNULL(@ReturnValue,';')
    
RETURN @ReturnValue
END

自定义函数的使用方法是这样的,注意[dbo]不能省:

SELECT DepID, [dbo].[FN_GetDepStaffNamesByDepID](DepID) As StaffNames
FROM DepStaffs

效果图:

上图显示有重复数据,加上Group By过滤掉就可以了,完整的用法:

SELECT DepID, [dbo].[FN_GetDepStaffNamesByDepID](DepID) As StaffNames
FROM DepStaffs
GROUP BY DepID

最终效果: