【工作笔记0037】Sqlserver分组查询Group By拼接字符串(拼接列的值)

我们有时候通常需要查询一个分组结果,然后将分组结果的字符串拼接起来,放在一个字段中,导出数据到文件。

假设有一张表 TVShow,存储了用户喜欢看的剧的信息,数据如下:

假设现在有一个需求,按用户名称、地区分组,查询出用户喜欢的所有剧集,并按照下面的excel导出来:

如果要实现上述的需求,发现一般的 分组查询用聚合函数不好实现。

话不多说,直接上代码:

SELECT Name AS 姓名,Area AS 区域,
    ((select '《' + TV + '》' from TVShow a where a.Name = TVShow.Name AND a.Area = TVShow.Area
        for xml path(''))) AS 喜欢的剧
FROM TVShow 
GROUP BY Name,Area

这里需要讲解一下 for xml path('') 的用途,该语句指的是将查询结果集合,每一条数据按照xml的格式处理后再返回。xml的标签格式,参数就在 path('') 中。 例如,执行如下 sql 可以得到下面的输出结果:

SELECT '《我爱你》' for xml path('a')
SELECT '《时间简史》' for xml path('book')

如果不填写 path('') 中的参数,则直接返回原始字符串并按照先后顺序拼接起来

回到需求,讲解一下sql:

(1)GROUP BY Name,Area 这里肯定是要满足两个条件的唯一分组,必须的

(2)((select '《' + TV + '》' from TVShow a where a.Name = TVShow.Name AND a.Area = TVShow.Area for xml path(''))) AS 喜欢的剧

这里,使用中间表,再读取一下 TVShow 数据,并根据唯一键 a.Name = TVShow.Name AND a.Area = TVShow.Area 定位到分组查询的结果,然后将结果集按照xml格式拼接起来为一个字符串,但分隔符我们不写,则表名按照原始的 TV 字段名,用书名号括起来后,按照先后顺序再拼接起来。

(3)最终看一下 sql 的运行结果:

(4)为了结果好看一些,我们排个序:

SELECT Name AS 姓名,Area AS 区域,
    ((select '《' + TV + '》' from TVShow a where a.Name = TVShow.Name AND a.Area = TVShow.Area
        for xml path(''))) AS 喜欢的剧
FROM TVShow 
GROUP BY Name,Area
ORDER BY Name DESC,Area

结果如下:

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SQL Server是Microsoft开发的关系型数据库管理系统(RDBMS),用于管理和存储数据。以下是一些SQL Server的笔记: 1. 数据库:SQL Server中的数据库可以包含多个表和视图等对象,每个数据库都有一个唯一的名称和一个文件组,文件组用于存储数据库文件。 2. 表:表是SQL Server中最基本的数据存储单位,表由和行组成,定义表中存储的数据类型,行包含实际的数据。 3. 索引:索引是用于加速数据检索的数据结构,SQL Server中有多种类型的索引,包括聚集索引、非聚集索引等。 4. 存储过程:存储过程是由SQL语句和控制语句组成的一段代码,可用于执行数据库操作,存储过程可接收参数和返回。 5. 触发器:触发器是一种特殊的存储过程,它会在特定的数据库事件发生时自动执行,例如数据插入、更新或删除。 6. 视图:视图是一种虚拟表,它是基于一个或多个表的查询结果构建的,视图可用于简化复杂的查询操作。 7. 外键:外键是用于建立表之间关系的机制,它用于保证数据的完整性和一致性。 8. 事务:事务是一组数据库操作,这些操作要么全部成功,要么全部失败,SQL Server提供了ACID事务机制,确保数据的一致性和可靠性。 9. 安全性:SQL Server提供了强大的安全性功能,包括身份验证、授权、加密等,可用于保护数据库和数据的机密性和完整性。 10. 监控和性能调整:SQL Server提供了多种工具和技术,用于监控数据库的性能和状态,以及对数据库进行性能调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值