sql - 如何将具有重复 ID 的行中的不同列值连接到一行中?

标签 sql sql-server t-sql concatenation

我有这个查询:

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

关于sql - 如何将具有重复 ID 的行中的不同列值连接到一行中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23122775/

相关文章:

sql - 获取基本的SQL Server表结构信息

sql-server - SQL Server : IN ('asd' ) not working when column is NTEXT

sql - Oracle XMLQuery 传递参数值

c# - 使用一个 SQL 表的三向连接

SQL 内存 - sys.dm_os_memory_objects

T-SQL——将逗号分隔列转换为多列

sql-server - 解析sql中的nvarchar(max)数据字段

sql - 使用重复条目更新行

c# - 无法让 SSIS 脚本任务工作

sql-server - 在 VBA 中执行 SQL 时出现运行时错误