首先,我们需要使用 SQL 语句来把重复行数据合并为一行并用逗号分隔,可以通过以下步骤来完成:
步骤一:创建测试数据表
我们需要创建测试数据表,以便后面的两个示例可以使用相同的数据进行演示。下面是创建测试表的 SQL 语句:
CREATE TABLE dbo.test_data
(
id INT PRIMARY KEY,
name NVARCHAR(50),
group_name NVARCHAR(50)
);
INSERT INTO dbo.test_data (id, name, group_name)
VALUES
(1, N'张三', N'组1'),
(2, N'张三', N'组2'),
(3, N'李四', N'组1'),
(4, N'王五', N'组1'),
(5, N'王五', N'组3');
步骤二:使用 FOR XML PATH 实现数据合并
使用 SQL Server 中的 FOR XML PATH 语句可以实现把多行数据合并为一行数据,并用逗号分隔的目的。具体的 SQL 语句如下:
SELECT name, STUFF((SELECT ', ' + group_name
FROM dbo.test_data b
WHERE b.name = a.name
FOR XML PATH ('')), 1, 1, '') AS groups
FROM dbo.test_data a
GROUP BY name;
解释一下上述 SQL 语句:
- 第一行:表示选择 name 列,并且为 STUFF 函数提供子查询;
- 第二行:STUFF 函数可以用于字符串的修改,在这里用于去除最后的分隔符(即逗号),具体使用方式如下:
- STUFF(, 1, 1, '') 表示在字符串的第 1 个位置(从 1 开始算),删除长度为 1 的字符,即删除第一个逗号,并用空字符串替代它;
- (SELECT ', ' + group_name FROM dbo.test_data b WHERE b.name = a.name FOR XML PATH ('')) 表示在 b 表中选择 group_name 列,并且将其用逗号和空格组合起来,然后将结果传递给 STUFF 函数进行修改;
- FOR XML PATH ('') 表示将结果以 XML 的形式返回;空字符表示不用标记 XML 元素;
- 第三行:表示对结果进行分组,分组的条件是每个组的成员的 name 值相同。
示例一:将某个字段按逗号拼接,并去除重复值
假设我们要把 test_data 表的 group_name 列按照逗号分隔,并去除重复值,我们可以执行以下 SQL 语句:
SELECT name, STUFF((SELECT ', ' + a.group_name
FROM (SELECT DISTINCT group_name, name FROM dbo.test_data) a
WHERE a.name = b.name
FOR XML PATH ('')), 1, 1, '') AS groups
FROM (SELECT DISTINCT name FROM dbo.test_data) b;
解释一下上述 SQL 语句:
- 第二行中的 a 表是由 test_data 表中去除重复行后的结果;
- 第三行中的 b 表是由 a 表中选择不同的 name 值后形成的,以保证不同的人名不会重复出现;
- 其他部分和上面的 SQL 语句一致。
示例二:不将重复的行合并为一行,而是将每个数据都分别输出
如果我们不希望把 test_data 表的 group_name 列合并为一行,而希望每个 group_name 都分别输出,可以执行以下 SQL 语句:
SELECT distinct name,
STUFF((SELECT ',' + b.group_name
FROM dbo.test_data b
WHERE a.name = b.name
FOR XML PATH('')), 1, 1, '') AS groups
FROM dbo.test_data a;
解释一下上述 SQL 语句:
- 第二行中的 b 表是原来的 test_data 表;
- 然后使用与前面类似的 SELECT 语句,不同之处在于不使用 GROUP BY 语句就可以得到分组后的结果,从而能够保留每个 group_name。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SQL Server中使用SQL语句实现把重复行数据合并为一行并用逗号分隔 - Python技术站