【SQL】通过Sql实现根据分组合并指定列内容的查询 SamWang

问题:

  最近在做一个项目的时候,遇到这样一个要求,模拟要求如下:  

ID  SName
1    张三
1    李四
2    刘六
2    王五

要的结果是
ID name
1  张三,李四
2  刘六,王五

即按ID组查询,并将相同的ID对应SName内容通过逗号合并

 

解决思路:

  通过传递不同的id给函数,查询出组合的SName并返回。

--创建测试表
IF NOT EXISTS(SELECT * FROM sysobjects WHERE id=OBJECT_ID(N'StudentsInfo') AND OBJECTPROPERTY(id,N'IsUserTable')=1)
CREATE TABLE StudentsInfo
(
    Id INT,
    SName NVARCHAR(20)
)
GO

--添加测试数据
INSERT INTO StudentsInfo VALUES (1,'张三')
INSERT INTO StudentsInfo VALUES (1,'李四')
INSERT INTO StudentsInfo VALUES (2,'刘六')
INSERT INTO StudentsInfo VALUES (2,'王五')
GO

--创建函数
IF EXISTS(SELECT * FROM sysobjects WHERE id=OBJECT_ID(N'GetStudentsInfoNamesByID') AND OBJECTPROPERTY(id,N'IsScalarFunction')=1)
    DROP FUNCTION GetStudentsInfoNamesByID
GO
CREATE FUNCTION GetStudentsInfoNamesByID(@Id INT)
    RETURNS NVARCHAR(4000)
AS
BEGIN
    DECLARE @SNames NVARCHAR(4000)
    SET @SNames = ''
    SELECT @SNames = @SNames+','+SName FROM StudentsInfo WHERE id = @Id
    RETURN STUFF(@SNames,1,1,'')
END
GO    

--查询
SELECT id,dbo.GetStudentsInfoNamesByID(id) AS SNames FROM StudentsInfo GROUP BY id

 

总结:

  整体思路还是比较简单的,但是很多时间都不怎么使用函数进行处理,这里也算抛砖引玉做个记录。至于上面的效率问题怎么样,就暂不做考虑了。

 

链接:

  下面这两篇博文很不错,用三种方法实现上面的要求,而且还有效率的对比,很细致,推荐一下!(感谢 CrazyJinn的分享)

  关于SQL函数效率的一些测试与思考
  关于SQL一对多关系转换的效率思考(续)

 

posted on 2012-11-23 11:15  SamWang  阅读(5896)  评论(9编辑  收藏  举报