代码之家  ›  专栏  ›  技术社区  ›  dan6657

将SQL行与多个值串联[重复]

  •  0
  • dan6657  · 技术社区  · 7 年前

    当前表格:



    txtFullName  | First Activity
    _____________________________
    
    Joe Bloggs   | Football
    
    Joe Bloggs   | Tennis    
    
    Katie Bloggs | Tennis
    


    我想把它作为。。。

    txtFullName  | First Activity
    _____________________________
    Joe Bloggs   | Football, Tennis
    
    Katie Bloggs | Tennis
    



    **我试过使用COALESCE和FOR XML PATH(“”)。。我似乎不能正确地把它放在这句话中。。还有其他方法做同样的事情吗?

    任何帮助都将不胜感激!!

    2 回复  |  直到 7 年前
        1
  •  2
  •   Valerica    7 年前

    这里有一个基于您的结果的XML示例。现在,您可以将查询放入CTE中,并将此解决方案应用于结果。

    declare @tbl as table (
        txtFullName varchar(15)
        ,firstActivity varchar(15)
    )
    
    insert into @tbl values ('Joe Bloggs', 'Football')
    insert into @tbl values ('Joe Bloggs', 'Tennis')
    insert into @tbl values ('Katie Bloggs', 'Tennis')
    
    
    
    SELECT
        txtFullName
        ,STUFF(
            (SELECT ', ' + firstActivity
            FROM @tbl
            WHERE txtFullName = a.txtFullName
            FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'') AS firstActivity
    FROM @tbl a
    GROUP BY txtFullName
    

    更新:

    SELECT
        t0.txtFullName AS 'Name'
        ,t1.[FirstActivity]
    FROM (
        SELECT txtFullName FROM tblMembers WHERE txtForm = '10'
    ) T0 
    LEFT JOIN (
        SELECT
            txtFullName
            ,STUFF(
            (SELECT ', ' + txtName
            FROM tblLists
            INNER JOIN tblAllLists
                ON tblLists.intID = tblAllLists.intID
            INNER JOIN tblMembers
                ON tblAllLists.instuiID = tblMembers.instuiID
            WHERE txtFullName = M.txtFullName
            FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'') AS firstActivity
        FROM tblLists
        INNER JOIN tblAllLists
            ON tblLists.intID = tblAllLists.intID
        INNER JOIN tblMembers M
            ON tblAllLists.instuiID = M.instuiID 
        WHERE txtDay = 'Mon' AND txtForm = '10' AND txtDesc='Norm'
        GROUP BY txtFullName
    ) T1
        ON t0.txtFullName = t1.txtFullName
    
        2
  •  1
  •   Indent    7 年前

    您可以使用 STRING_AGG (自SQL Server 2017年起)

    SELECT
        txtFullName,
        STRING_AGG(txtName,',')  AS 'First Activity'
    FROM
        tblLists
        INNER JOIN tblMembers ON
            tblLists.txtInstituID = tblMembers.txtInstituID
        INNER JOIN tblAllLists ON
            tblLists.intID = tblAllLists.intID 
    WHERE
      Day = 'Mon' AND
      txtForm = '10' AND
      Desc='Norm' AND
      txtID = '10'
    GROUP BY
        txtFullName