小编典典

连接行值T-SQL

sql

我正在尝试将一些数据汇总为一个报告,并且需要连接表之一的行值。这是基本的表结构:

评论

 ReviewID  
 ReviewDate

审稿人

 ReviewerID  
 ReviewID  
 UserID

用户数

UserID  
FName  
LName

这是M:M关系。每个审阅可以有许多审阅者;每个用户可以与许多评论相关联。

基本上,我要查看的是Reviews.ReviewID,Reviews.ReviewDate和该评论的所有关联用户的FName的串联字符串(以逗号分隔)。

代替:

ReviewID---ReviewDate---User  
1----------12/1/2009----Bob  
1----------12/1/2009----Joe  
1----------12/1/2009----Frank  
2----------12/9/2009----Sue  
2----------12/9/2009----Alice

显示此:

ReviewID---ReviewDate----Users  
1----------12/1/2009-----Bob, Joe, Frank  
2----------12/9/2009-----Sue, Alice

我发现这个文章描述了一些方法可以做到这一点,但大多数的这些似乎只与一个表,而不是多个处理;
不幸的是,我的SQL-fu不够强大,无法适应我的情况。我对该站点上使用FOR XML PATH()的示例特别感兴趣,因为它看起来最干净,最直接。

SELECT p1.CategoryId,
( SELECT ProductName + ', '
  FROM Northwind.dbo.Products p2
  WHERE p2.CategoryId = p1.CategoryId
  ORDER BY ProductName FOR XML PATH('')
) AS Products
FROM Northwind.dbo.Products p1
GROUP BY CategoryId;

谁能帮我这个忙吗?任何帮助将不胜感激!


阅读 151

收藏
2021-05-05

共1个答案

小编典典

看看这个

DECLARE @Reviews TABLE(
        ReviewID INT,
        ReviewDate DATETIME
)

DECLARE @Reviewers TABLE(
        ReviewerID   INT,
        ReviewID   INT,
        UserID INT
)

DECLARE @Users TABLE(
        UserID  INT,
        FName  VARCHAR(50),
        LName VARCHAR(50)
)

INSERT INTO @Reviews SELECT 1, '12 Jan 2009'
INSERT INTO @Reviews SELECT 2, '25 Jan 2009'

INSERT INTO @Users SELECT 1, 'Bob', ''
INSERT INTO @Users SELECT 2, 'Joe', ''
INSERT INTO @Users SELECT 3, 'Frank', ''
INSERT INTO @Users SELECT 4, 'Sue', ''
INSERT INTO @Users SELECT 5, 'Alice', ''

INSERT INTO @Reviewers SELECT 1, 1, 1
INSERT INTO @Reviewers SELECT 2, 1, 2
INSERT INTO @Reviewers SELECT 3, 1, 3
INSERT INTO @Reviewers SELECT 4, 2, 4
INSERT INTO @Reviewers SELECT 5, 2, 5

SELECT  *,
        ( 
            SELECT  u.FName + ','
            FROM    @Users u INNER JOIN 
                    @Reviewers rs ON u.UserID = rs.UserID
            WHERE   rs.ReviewID = r.ReviewID
            FOR XML PATH('')
        ) AS Products
FROM    @Reviews r
2021-05-05