我有很多行,其中 5 列相同,而第 6 列不同。
我希望能够将第 6 列的 5 列和连接行值组合成一个
我试过使用 CTE 和 STUFF,但我似乎无法让它做我需要的事情。我还看到丢失了如何将列汇总到一行的示例,但大多数示例只处理 2 列(例如用户和课程)
我正在使用 SQL Server 2016(130),所以我不能使用 STRING_AGG
这是我从下面的查询中得到的数据
站点名称 | 页面标题 | pageurl | 创建日期 | 过期日期 | 审稿人 |
---|---|---|---|---|---|
x站点 | sql连接 | //abc.com/fr | 02/02/2023 | 28/02/2023 | 詹姆斯 (jk [email protected]) |
x站点 | sql连接 | //abc.com/fr | 02/02/2023 | 28/02/2023 | 大卫 (dDel [email protected]) |
x站点 | sql连接 | //abc.com/fr | 02/02/2023 | 28/02/2023 | 阿里 (aLee [email protected]) |
x站点 | 加入 SQL | //abc.com/vf | 18/02/2020 | 2/05/2022 | 肯 (kK [email protected]) |
y网站 | 只是 SQL | //abc.com/a | 31/01/2022 | 21/05/2023 |
这就是我要退货的东西
站点名称 | 页面标题 | pageurl | 创建日期 | 过期日期 | 审稿人 |
---|---|---|---|---|---|
x站点 | sql连接 | //abc.com/fr | 02/02/2023 | 28/02/2023 | 詹姆斯 (jk [email protected])、大卫 (dDel [email protected])、阿里 (aLee [email protected]) |
x站点 | 加入 SQL | //abc.com/vf | 18/02/2020 | 2/05/2022 | 肯 (kK [email protected]) |
y网站 | 只是 SQL | //abc.com/a | 31/01/2022 | 21/05/2023 |
WITH cte_contentExpiry AS (
SELECT c.sitename
,c.pagetitle
,c.pageurl
,c.dateCreated
,c.expiryDate
,a.userid
FROM dbo.content c
LEFT OUTER JOIN dbo.assignments a
ON c.contentId = a.contentId
WHERE c.active = 1
) SELECT q.sitename
,q.pagetitle
,q.pageurl
,q.dateCreated
,q.expiryDate
,
STUFF((SELECT '; ' + u.fName + ' (' + u.userName + ' - ' + u.email + ')'
FROM dbo.users u
WHERE q.userId = u.userId
FOR XML PATH('')), 1, 1, '') AS reviewer
FROM cte_contentExpiry q
GROUP BY q.sitename
,q.pagetitle
,q.pageurl
,q.dateCreated
,q.expiryDate
,q.userId
请尝试以下解决方案。
SQL
-- DDL and sample data population, start
DECLARE @content TABLE
(
contentId int,
sitename varchar(20),
pageTitle varchar(30),
pageURL varchar(30),
dateCreated date,
expiryDate date,
active bit
);
DECLARE @assignments TABLE (userid int, contentId int);
DECLARE @users TABLE
(
userid int,
fname varchar(20),
userName varchar(30),
email varchar(30)
);
INSERT INTO @assignments (contentId,userid) VALUES
(1001,200),
(1001,201),
(1001,202),
(1002,203),
(1003,NULL);
INSERT INTO @users (userid,fname, userName, email) VALUES
(200,'James','jk','[email protected]'),
(201,'David','dDel','[email protected]'),
(202,'Ali','aLee','[email protected]'),
(203,'Ken','Ken','[email protected]');
INSERT INTO @content
(contentId,sitename, pageTitle, pageurl, dateCreated, expiryDate, active)
VALUES
(1001,'xSite','sql concat','//abc.com/fr','2023-02-02','2023-02-02',1),
(1002,'xSite','Join in SQL','//abc.com/vf','2020-02-20','2022/05/22',1),
(1003,'ySite','Just SQL','//abc.com/a','2022-01-31','2023-05-21',1);
-- DDL and sample data population, end
;WITH rs AS
(
SELECT c.sitename
, c.pagetitle
, c.pageurl
, c.dateCreated
, c.expiryDate
, u.*
--, STRING_AGG(CONCAT(u.fName,' (',u.userName,' - ',u.email,')'),'; ')
FROM @content AS c
LEFT OUTER JOIN @assignments AS a
ON c.contentId = a.contentId
LEFT OUTER JOIN @users AS u ON a.userId = u.userId
WHERE c.active = 1
)
SELECT sitename
, pagetitle
, pageurl
, dateCreated
, expiryDate
, STUFF((SELECT '; ' + c.fName + ' (' + c.userName + ' - ' + c.email + ')'
FROM rs AS c
WHERE p.sitename = c.sitename
AND p.pagetitle = c.pagetitle
AND p.pageurl = c.pageurl
AND p.dateCreated = c.dateCreated
AND p.expiryDate = c.expiryDate
FOR XML PATH('')
), 1, 2, '') AS reviewer
FROM rs AS p
GROUP BY sitename
, pagetitle
, pageurl
, dateCreated
, expiryDate;
输出
站点名称 | 页面标题 | pageurl | 创建日期 | 过期日期 | 审稿人 |
---|---|---|---|---|---|
x站点 | 加入 SQL | //abc.com/vf | 2020-02-20 | 2022-05-22 | 肯(肯 - [email protected]) |
x站点 | sql连接 | //abc.com/fr | 2023-02-02 | 2023-02-02 | 詹姆斯(jk - [email protected]);大卫(dDel - [email protected]);阿里 (aLee - [email protected]) |
y网站 | 只是 SQL | //abc.com/a | 2022-01-31 | 2023-05-21 | 空 |