Sql 如何将具有重复ID的行中的不同列值连接到一行中?
我有一个疑问:Sql 如何将具有重复ID的行中的不同列值连接到一行中?,sql,sql-server,tsql,concatenation,Sql,Sql Server,Tsql,Concatenation,我有一个疑问: SELECT DISTINCT ces.CourseEventKey, up.Firstname + ' ' + up.Lastname FROM InstructorCourseEventSchedule ices INNER JOIN CourseEventSchedule ces ON ces.CourseEventScheduleKey = ices.MemberKey INNER JOIN UserPro
SELECT DISTINCT
ces.CourseEventKey,
up.Firstname + ' ' + up.Lastname
FROM InstructorCourseEventSchedule ices
INNER JOIN CourseEventSchedule ces ON ces.CourseEventScheduleKey = ices.MemberKey
INNER JOIN UserProfile up ON up.UserKey = ices.UserKey
WHERE ces.CourseEventKey IN
(
SELECT CourseEventKey
FROM @CourseEvents
)
ORDER BY CourseEventKey
它生成以下结果集:
CourseEventKey Name
-------------- --------------------
30 JACK K. BACKER
30 JEFFREY C PHILIPPEIT
30 ROBERT B. WHITE
33 JEFFREY C PHILIPPEIT
33 KENNETH J. SIMCICH
35 JACK K. BACKER
35 KENNETH J. SIMCICH
76 KENNETH J. SIMCICH
90 BARRY CRANFILL
90 KENNETH J. SIMCICH
数据是准确的,但我需要结果集如下所示:
CourseEventKey Name
-------------- --------------------
30 JACK K. BACKER; JEFFREY C PHILIPPEIT; ROBERT B. WHITE
33 JEFFREY C PHILIPPEIT; KENNETH J. SIMCICH
35 JACK K. BACKER; KENNETH J. SIMCICH
76 KENNETH J. SIMCICH
90 BARRY CRANFILL; KENNETH J. SIMCICH
我见过类似于我的问题的工作解决方案,但我无法将这些解决方案用于我的数据
如何更改查询以使用某种形式的连接生成第二个结果集
提前感谢。您可以在内部查询中使用
FOR XML PATH(“”)
来获取连接的值,然后使用它与外部查询中的CourseEventKey
匹配:
;WITH CTE
AS
(
SELECT DISTINCT
ces.CourseEventKey,
up.Firstname + ' ' + up.Lastname AS Name
FROM InstructorCourseEventSchedule ices
INNER JOIN CourseEventSchedule ces ON ces.CourseEventScheduleKey = ices.MemberKey
INNER JOIN UserProfile up ON up.UserKey = ices.UserKey
WHERE ces.CourseEventKey IN
(
SELECT CourseEventKey
FROM @CourseEvents
)
)
SELECT DISTINCT i1.CourseEventKey,
STUFF(
(SELECT
'; ' + Name
FROM CTE i2
WHERE i1.CourseEventKey = i2.CourseEventKey
FOR XML PATH(''))
,1,2, ''
)
FROM CTE i1
ORDER BY i1.CourseEventKey
创建一个函数,该函数将CourseEventScheduleKey作为参数,并返回一个串联的用户字符串。然后你可以像这样使用它:
select CourseEventScheduleKey,
dbo.getUsersForCourse(CourseEventScheduleKey) as Users
from CourseEventSchedule
order by CourseEventScheduleKey
这应该是你想要的。
该函数如下所示:
create function getUsersForCourse(@CourseEventScheduleKey int)
returns varchar(max)
as
begin
declare @ret varchar(max)
set @ret = ''
select @ret = @ret + up.Firstname + ' ' + up.Lastname + '; '
from CourseEventSchedule ces
inner join InstructorCourseEventSchedule ices
on ces.CourseEventScheduleKey = ices.MemberKey
inner join UserProfile up
on up.UserKey = ices.UserKey
where ces.CourseEventScheduleKey = @@CourseEventScheduleKey
order by up.Lastname, up.Firstname
if(@ret = '')
return @ret
-- trim off the last semi colon and space
return substring(@ret, 1, len(@ret) - 2)
end
这样地?看起来您可能只是复制/粘贴了其他人的答案,并插入了我的一些表名。你能再看一眼我的问题,也许再修改一下你的答案吗?@kehrk我从另一个问题到这个问题采纳了我先前的答案。到底出了什么问题?查询不返回任何内容,因为代码中缺少键表,而您正在查询我之前声明的表变量。我修改了这个问题,让它更有意义。好吧,我还以为你要用
@Instructors
来获得结果。太棒了,我觉得它很管用。非常感谢您的帮助。有些语法看起来有点不对劲。
select distinct ces.CourseEventKey,STUFF((SELECT ', ' +up.Firstname + ' ' + up.Lastname) AS Name
FROM UserProfile up
where UP.id = UserKey = ices.UserKey
FOR XML PATH (''))
, 1, 1, '') AS Name) FROM InstructorCourseEventSchedule ices
INNER JOIN CourseEventSchedule ces ON ces.CourseEventScheduleKey = ices.MemberKey
WHERE ces.CourseEventKey IN
(
SELECT CourseEventKey
FROM @CourseEvents
)