在SQL Server中将多个字段合并为一个文本字段
我有一张桌子,看起来像这样: Name ID TaskID HoursAssigned ---------------------------------------------------------------- John Smith 4592 A01 40 Matthew Jones 2863 A01 20 Jake Adams 1182 A01 100 Matthew Jones 2863 A02 50 Jake Adams 2863 A02 10 TaskID PeopleAssigned ------------------------------------------------------------ A01 Jake Adams, John Smith, Matthew Jones A02 Matthew Jones, Jake Adams 我想返回一个如下所示的数据集: Name ID TaskID HoursAssigned ---------------------------------------------------------------- John Smith 4592 A01 40 Matthew Jones 2863 A01 20 Jake Adams 1182 A01 100 Matthew Jones 2863 A02 50 Jake Adams 2863 A02 10 TaskID PeopleAssigned ------------------------------------------------------------ A01 Jake Adams, John Smith, Matthew Jones A02 Matthew Jones, Jake Adams在SQL Server中将多个字段合并为一个文本字段,sql,sql-server,tsql,string-concatenation,Sql,Sql Server,Tsql,String Concatenation,我有一张桌子,看起来像这样: Name ID TaskID HoursAssigned ---------------------------------------------------------------- John Smith 4592 A01 40 Matthew Jones 2863 A01
这里的问题是,我不知道有多少人被分配到一个给定的任务。任何建议都很好 我不熟悉sql,也不熟悉stackoverflow,但这不管用吗
选择taskid,name FROM table GROUP BY taskid我是sql新手,也是stackoverflow新手,但这不管用吗
按taskid从表组中选择taskid、名称这里每天都会问这个问题。及
这里每天都有人问这个问题。及 试试这个:
declare @table table (name varchar(30), ID int, TaskID char(3), HoursAssigned int)
insert into @table values ('John Smith' ,4592 ,'A01' ,40)
insert into @table values ('Matthew Jones',2863 ,'A01' ,20)
insert into @table values ('Jake Adams' ,1182 ,'A01' ,100)
insert into @table values ('Matthew Jones',2863 ,'A02' ,50)
insert into @table values ('Jake Adams' ,2863 ,'A02' ,10)
--formatted so you can see what is happening
SELECT DISTINCT
t1.TaskID
,SUBSTRING(
replace(
replace(
(SELECT
t2.Name
FROM @Table AS t2
WHERE t1.TaskID=t2.TaskID
ORDER BY t2.Name
FOR XML PATH(''))
,'</NAME>','')
,'<NAME>',', ')
,3,2000) AS PeopleAssigned
FROM @table AS t1
试试这个:
declare @table table (name varchar(30), ID int, TaskID char(3), HoursAssigned int)
insert into @table values ('John Smith' ,4592 ,'A01' ,40)
insert into @table values ('Matthew Jones',2863 ,'A01' ,20)
insert into @table values ('Jake Adams' ,1182 ,'A01' ,100)
insert into @table values ('Matthew Jones',2863 ,'A02' ,50)
insert into @table values ('Jake Adams' ,2863 ,'A02' ,10)
--formatted so you can see what is happening
SELECT DISTINCT
t1.TaskID
,SUBSTRING(
replace(
replace(
(SELECT
t2.Name
FROM @Table AS t2
WHERE t1.TaskID=t2.TaskID
ORDER BY t2.Name
FOR XML PATH(''))
,'</NAME>','')
,'<NAME>',', ')
,3,2000) AS PeopleAssigned
FROM @table AS t1
顺便说一句,在一个字段中存储名称是个坏主意。这使得查询变得非常困难。如果不使用通配符作为阻止数据库使用索引的第一个字符,您将如何有效地搜索Smith。如果名字是这样自由存储的,一个人可能是约翰·史密斯,史密斯,约翰,史密斯,约翰·史密斯,约翰·史密斯,约翰·史密斯等等,你不会意识到他们是同一个人。你应该至少有名字、中间名、姓氏、个人后缀,然后你可以有一个计算字段,以你想要的格式显示全名。顺便说一句,把名字存储在一个字段中是个坏主意。这使得查询变得非常困难。如果不使用通配符作为阻止数据库使用索引的第一个字符,您将如何有效地搜索Smith。如果名字是这样自由存储的,一个人可能是约翰·史密斯,史密斯,约翰,史密斯,约翰·史密斯,约翰·史密斯,约翰·史密斯等等,你不会意识到他们是同一个人。你应该至少有名字、中间名、姓氏、个人后缀,然后你可以有一个计算字段,以你想要的格式显示全名。Right!我错过了那些。我的错!最后一个问题。没问题-这个网站上的搜索和标记还不够好,人们在提问之前还没有找到这些例子。对!我错过了那些。我的错!最后一个问题。没问题-这个网站上的搜索和标记还不够好,人们在提问之前还没有找到这些例子。投票被否决是怎么回事?我已经说过,还有一个问题可以回答这个问题。+1,他们对周围的人很苛刻。投票被否决是怎么回事?我已经说过,还有一个问题可以回答这个问题。+1,他们对周围的人很苛刻。我并不是真的那样存储数据,这只是为了简单。我不是真的那样存储数据,这只是为了简单。