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

文章讲述了如何利用SQL的GROUPBY、FORXMLPATH函数来实现按用户名称和区域分组,查询并拼接用户喜欢的剧集信息,以便于数据导出到文件。在示例中,通过中间表和XML格式处理,将每个用户的剧集名连接成一个字符串,解决了非聚合函数下分组查询的难题。
摘要由CSDN通过智能技术生成

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

假设有一张表 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

结果如下:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值