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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

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

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

1GROUP 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

结果如下

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: SQL SERVER