首页 > 解决方案 > 如何连接多行的结果

问题描述

我目前在 SQL Server 中有一个视图,如下所示:

表格1:

Id
Desc
Mex

表2:

Id
IdTab1
Desc

视图选择 Table1 中的所有内容,左连接到 Id 上的 Table2 - IdTab1

现在我有一个与 Table2 连接的表 3,它具有以下字段:

表3:

Id
IdTab2
Code (VarChar(3))

我想在视图的选择中有一个新字段 Code 包含表 3 中的每个代码,并与 char ' ' 连接,而不更改从旧查询显示的记录(就像通过 concat 进行分组一样)每个匹配的代码加入。

我看到了其他一些帖子,但他们都没有使用这种方法。例如使用这个:

declare @result varchar(500)
set @result = ''
select @result = @result + ModuleValue + ', ' 
from TableX where ModuleId = @ModuleId

但是我遇到了两个问题。我无法在视图中使用声明(可能是因为语法错误),而且我必须按此分组,但我不知道如何。

示例结果基本视图

ID | IDTAB2 | DESC1 | DESC2 | MEX

1  |   2    |   aa  |  bb   |  4
2  |   1    |   ab  |  cc   |  2
2  |   2    |   bb  |  bc   |  2

示例结果加入表 3

ID | IDTAB2 | DESC1 | DESC2 | MEX | CODE 

1  |   2    |   aa  |  bb   |  4  |  CS
1  |   2    |   aa  |  bb   |  4  |  NN
2  |   1    |   ab  |  cc   |  2  |  AF
2  |   2    |   bb  |  bc   |  2  |  DC
2  |   2    |   bb  |  bc   |  2  |  KK
2  |   2    |   bb  |  bc   |  2  |  JD

需要示例结果

ID | IDTAB2 | DESC1 | DESC2 | MEX | CODENEW

1  |   2    |   aa  |  bb   |  4  | CS NN
2  |   1    |   ab  |  cc   |  2  | AF
2  |   2    |   bb  |  bc   |  2  | DC KK JD

标签: sqlsql-serversql-server-2016

解决方案


考虑到“示例结果加入 Table3 ”的输出,您可以根据您的 SQL 服务器版本尝试以下选项 -

对于 MSSQL-2016 及更早版本 -演示

SELECT DISTINCT A.ID,A.IDTAB2,A.DESC1,A.DESC2,A.MEX, 
SUBSTRING(
    (
        SELECT ' '+ B.CODE  AS [text()]
        FROM your_table B
        WHERE B.ID = A.ID
        AND B.IDTAB2 = A.IDTAB2
        AND B.DESC1 = A.DESC1
        AND B.DESC2 = A.DESC2
        AND B.MEX = A.MEX
        ORDER BY B.ID,B.IDTAB2,B.DESC1,B.DESC2,B.MEX
        FOR XML PATH ('')
    ), 2, 1000) [C_Name]
FROM your_table A

对于 MSSQL-2017 或更新版本 -演示

SELECT ID,IDTAB2,DESC1,DESC2,MEX,
STRING_AGG ( CODE, ' ' )
FROM your_table
GROUP BY ID,IDTAB2,DESC1,DESC2,MEX

推荐阅读