2016-03-02 41 views
2

我是新编写SQL脚本(至少比SELECT * FROM X多)。我遇到了一个问题,将一个表按一个值分组,然后将另一列中的值加入到单个字符串中。MS SQL - 由concat字符串组

我想在临时表上执行一个组,然后将组中的列的值连接在一起。

表变量(编辑),@categoriesToAdd,数据结构是[SubscriberId int,CategoryId int]。

我所试图做的是一样的东西(我的理解是,CONCAT是位来自MSSQL丢失):然后

SELECT SubscriberId, 
     CONCAT(CONVERT(VARCHAR(10), CategoryId) + ', ') as categoriesAdded 
FROM @categoriesToAdd 
GROUP BY SubscriberId 

的每个用户级联类别ID会看起来像: 0001, 0002,0003,0004

谢谢!

+0

您搜索'GROUP_CONCAT(MySQL的)/ LISTAGG(甲骨文)/ string_agg(PostgreSQL系统)'相当于MS SQL Server的。我建议使用'STUFF + FOR XML'。更多的信息和比较** [在Transact-SQL中连接行值](https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/)* * – lad2025

回答

2

在SQL Server中,你可以使用FOR XML PATH

select SubscriberId, 
categoriesAdded=Stuff((SELECT ',' + CAST(CategoryId as VARCHAR(255)) FROM catsToAdd t1 WHERE [email protected] 
FOR XML PATH ('')) 
      , 1, 1, '') 
from @categoriesToAdd as catsToAdd 
GROUP BY SubscriberId 
+0

@categoriesToAdd where语句“WHERE t1.SubscriberId = @ categoriesToAdd.SubscriberId”出现错误: “必须声明缩放变量”@categoriesToAdd'“ – Marek

+0

@Marek是一个临时表还是一个表变量?因为表变量在它们被定义的语句中有范围。 – Mihai

+0

我宣布它像 声明@ categoriesToAdd表 \t(SubscriberId INT, 类别ID INT) 很抱歉,如果我问的问题错了,我可以改变它! – Marek