[英]Replicating VBA solution in SQL
由于您使用的是 SQL Server 2017,您可以通过STRING_AGG
获得您想要的:
select column1, column2, string_agg(column3, '&') as column3, column4
from outputbefore
group by column1, column2, column4
您希望将多行连接成一个值。 您的选项取决于您的 SQL Server 版本。 在旧版本(我认为 2005+)中,您必须使用一个折磨人的 XML 过程。 在你的服务器上运行它,你会看到它是如何工作的,但我会让你来计算你的数据的查询:
SELECT STUFF(
(SELECT ', <' + name + '>'
FROM sys.databases
WHERE database_id > 4
ORDER BY name
FOR XML PATH('') ,
ROOT('MyString') ,
TYPE
).value('/MyString[1]', 'varchar(max)'), 1, 2, '') AS namelist;
从 SQL 2017 开始,您可以使用 STRING_AGG 函数, 在此处解释。
正如我所见,这是一个字符串连接问题。 我使用替换来处理 XML 中的字符 &。
select a.col1, Col3=replace(stuff((SELECT '#' + b.col3 AS 'data()'
FROM OutputBefore) b
where b.Col1=a.Col1
FOR XML PATH('')),1,1,''),'#','&')
from (select distinct Col1 from OutputBefore) a;
正如 forpas 和 Russell 所提到的,从 SQL 2017 开始,您可以使用 STRING_AGG 函数。
对于 SQL 2008+,请参考:
Stuff 和“For Xml Path”如何在 Sql Server 中工作
在您的情况下,您希望分隔符为 '&',这会由于 XML 特殊字符而导致 FOR XML PATH 出现问题。 因此,您需要转义 XML 特殊字符,例如:
DECLARE @TableA TABLE (Col1 NVARCHAR(10), Col2 INT, Col3 NVARCHAR(10), Col4
NVARCHAR(10), Col5 INT)
INSERT INTO @TableA (Col1, Col2, Col3, Col4, Col5)
VALUES ('Dave' , 24 , 'house' , 'married' , 2)
, ('Dave' , 24 , 'car' , 'married' , 2)
, ('Bob' , 32 , 'House' , 'single' , 1)
, ('George' , 12 , 'house' , 'divorced' , 1)
SELECT
t2.Col1
, t2.Col2
, STUFF ( ( SELECT '&' + Col3 -- Adding '&' as delimited
FROM @TableA t1
WHERE t1.Col2 = t2.Col2
FOR XML PATH (''), TYPE
).value('.', 'VARCHAR(MAX)'),1,1,''-- To escape special characters
) AS Col3
, t2.Col4
FROM @TableA AS t2
GROUP BY t2.Col1
, t2.Col2
, t2.Col4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.