[英]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.