繁体   English   中英

需要在 SQL 中将多行的列值合并为单行

[英]Need to Combine column values from multiple rows into single row in SQL

对于此查询,我得到具有多个值的类似行。 需要在单行中组合值。 我尝试使用 Stuff,但我无法这样做。 如果可能,只需要使用 SQL 函数和没有 Pl/SQL 代码来组织数据。

STUFF((SELECT '| ' + udn1.DisplayName 
          FROM vUserDisplayName udn1
          FOR XML PATH('')), 1, 1, '') [USERS]

SELECT  gdn.DisplayName,
            ,ISNULL(udn.DisplayName, N'No user assigned') AS [User]
    
        FROM tbGroup g 
            INNER JOIN vGroupDisplayName gdn
                ON g.GroupId = gdn.GroupId
            LEFT JOIN tbUserGroup ug
                ON g.GroupId = ug.GroupId
            LEFT JOIN tbUser u
                ON ug.UserId = u.UserId 
            LEFT JOIN vUserDisplayName udn
                ON u.UserId = udn.UserId 
        WHERE
            (u.[Enabled] = 1 OR u.UserId IS NULL)
            AND
            g.IsPersonal = 0
            AND
            g.SystemGroup = 0

Output:

DisplayName                User
a                     abc@gmail.com
a                     def@gmail.com
a                     ghi@gmail.com
b                     ghi@gmail.com
b                     jkl@gmail.com
b                     mno@gmail.com
c                     pqr@gmail.com
c                     stu@gmail.com
c                     vwx@gmail.com

预期 Output:

DisplayName                User
a                     abc@gmail.com|def@gmail.com|ghi@gmail.com                  
b                     ghi@gmail.com|jkl@gmail.com|mno@gmail.com              
c                     pqr@gmail.com|stu@gmail.com|vwx@gmail.com              

对于 SQL 服务器 2016:

使用公用表表达式:

With cte as
(
        SELECT  gdn.DisplayName,
            ISNULL(udn.DisplayName, N'No user assigned') AS [User]
    
        FROM tbGroup g 
            INNER JOIN vGroupDisplayName gdn
                ON g.GroupId = gdn.GroupId
            LEFT JOIN tbUserGroup ug
                ON g.GroupId = ug.GroupId
            LEFT JOIN tbUser u
                ON ug.UserId = u.UserId 
            LEFT JOIN vUserDisplayName udn WITH (NOLOCK)
                ON u.UserId = udn.UserId 
        WHERE
            (u.[Enabled] = 1 OR u.UserId IS NULL)
            AND
            g.IsPersonal = 0
            AND
            g.SystemGroup = 0
)
       SElecT displayname, STUFF((SELECT  '|' + ([user])
            FROM cte tt where  tt.displayname=t.displayname
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
        from cte t group by displayname

使用子查询:

   SElecT displayname, STUFF((SELECT  '|' + ([user])
        FROM ( SELECT  gdn.DisplayName,
        ISNULL(udn.DisplayName, N'No user assigned') AS [User]

    FROM tbGroup g 
        INNER JOIN vGroupDisplayName gdn
            ON g.GroupId = gdn.GroupId
        LEFT JOIN tbUserGroup ug
            ON g.GroupId = ug.GroupId
        LEFT JOIN tbUser u
            ON ug.UserId = u.UserId 
        LEFT JOIN vUserDisplayName udn WITH (NOLOCK)
            ON u.UserId = udn.UserId 
    WHERE
        (u.[Enabled] = 1 OR u.UserId IS NULL)
        AND
        g.IsPersonal = 0
        AND
        g.SystemGroup = 0) tt where  tt.displayname=t.displayname
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')
    from ( SELECT  gdn.DisplayName,
        ISNULL(udn.DisplayName, N'No user assigned') AS [User]

    FROM tbGroup g 
        INNER JOIN vGroupDisplayName gdn
            ON g.GroupId = gdn.GroupId
        LEFT JOIN tbUserGroup ug
            ON g.GroupId = ug.GroupId
        LEFT JOIN tbUser u
            ON ug.UserId = u.UserId 
        LEFT JOIN vUserDisplayName udn WITH (NOLOCK)
            ON u.UserId = udn.UserId 
    WHERE
        (u.[Enabled] = 1 OR u.UserId IS NULL)
        AND
        g.IsPersonal = 0
        AND
        g.SystemGroup = 0) t group by displayname

您可以将string_agg()用于 sql 服务器 2017 及更高版本。

  SELECT  gdn.DisplayName,
            string_agg(ISNULL(udn.DisplayName, N'No user assigned'),'|') AS [User]
    
        FROM tbGroup g 
            INNER JOIN vGroupDisplayName gdn
                ON g.GroupId = gdn.GroupId
            LEFT JOIN tbUserGroup ug
                ON g.GroupId = ug.GroupId
            LEFT JOIN tbUser u
                ON ug.UserId = u.UserId 
            LEFT JOIN vUserDisplayName udn WITH (NOLOCK)
                ON u.UserId = udn.UserId 
        WHERE
            (u.[Enabled] = 1 OR u.UserId IS NULL)
            AND
            g.IsPersonal = 0
            AND
            g.SystemGroup = 0
        group by gdn.DisplayName

小提琴示例:

 create table testtable( DisplayName varchar(10), [User] varchar(50));
 insert into testtable values('a',                     'abc@gmail.com');
 insert into testtable values('a',                     'def@gmail.com');
 insert into testtable values('a',                     'ghi@gmail.com');
 insert into testtable values('b',                     'ghi@gmail.com');
 insert into testtable values('b',                     'jkl@gmail.com');
 insert into testtable values('b',                     'mno@gmail.com');
 insert into testtable values('c',                    'pqr@gmail.com');
 insert into testtable values('c',                    'stu@gmail.com');
 insert into testtable values('c',                     'vwx@gmail.com');

询问:

 select displayname,string_agg([User],'|') as [User] from testtable
 group by displayname
 GO

Output:

显示名称 用户
一个 abc@gmail.com ghi@gmail.com
b ghi@gmail.com mno@gmail.com
c pqr@gmail.com vwx@gmail.com

db<小提琴在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM