在其他列相同的情况下连接一列

问题描述 投票:0回答:1

我有很多行,其中 5 列相同,而第 6 列不同。

我希望能够将第 6 列的 5 列和连接行值组合成一个

我试过使用 CTE 和 STUFF,但我似乎无法让它做我需要的事情。我还看到丢失了如何将列汇总到一行的示例,但大多数示例只处理 2 列(例如用户和课程)

我正在使用 SQL Server 2016(130),所以我不能使用 STRING_AGG

查询SQL FIddle

这是我从下面的查询中得到的数据

站点名称 页面标题 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-server tsql common-table-expression
1个回答
0
投票

请尝试以下解决方案。

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
© www.soinside.com 2019 - 2024. All rights reserved.