【问题标题】:How to concatenate distinct column values from rows with duplicate IDs into one row?如何将具有重复 ID 的行中的不同列值连接到一行?
【发布时间】:2014-06-01 02:42:40
【问题描述】:

我有这个问题:

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

我曾在可行的解决方案中看到过类似的问题,但我终其一生都无法调整这些解决方案来处理我的数据。

如何更改我的查询以使用某种形式的连接生成第二个结果集?

提前致谢。

【问题讨论】:

标签: sql sql-server tsql concatenation


【解决方案1】:

您可以在内部查询中使用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

【讨论】:

  • 看起来您可能刚刚复制/粘贴了其他人的答案并插入了我的一些表名。你能再看看我的问题,也许可以修改你的答案吗?
  • @kehrk 我采用了我之前从另一个问题对这个问题的回答。究竟出了什么问题?
  • 查询没有返回任何内容,因为代码中缺少关键表,并且您正在查询我之前声明的表变量。我修改了问题以使其更有意义。
  • 好的,我虽然你打算使用@Instructors 来获得结果。
  • 太棒了,我认为它有效。非常感谢您的帮助。
【解决方案2】:

您创建了一个函数,该函数将 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

【讨论】:

    【解决方案3】:
    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
                    )
    

    【讨论】:

    • 有些语法看起来很离谱。
    猜你喜欢
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多